目前我刚刚开始使用Hibernate。我很困惑为什么@Entity (name="USER_DETAILS")
public class UserDetails {
@Id
private int userId;
private String userName;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
@Column (name="USER_NAME")
public String getUserName() {
return userName + " from name getter";
}
public void setUserName(String userName) {
this.userName = userName;
}
}
注释不适用于getter。据我所知,它适用于字段和getter但不适用于setter。我做错了什么?
userName
数据库中的"from name getter"
列更改和public static void main(String[] args) {
// TODO Auto-generated method stub
UserDetails user=new UserDetails();
user.setUserId(1);
user.setUserName("First User");
SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.openSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
session.close();
}
都不会附加到其值中。
这是我的主要课程:
nosetests
答案 0 :(得分:1)
您遇到的问题是由同一实体中的混合访问模式引起的。如果要混合访问模式,则必须执行以下步骤:
定义默认访问模式,如下所示:
@Entity
@Access(AccessType.FIELD)
public class UserDetails { ...}
使用此设置,默认访问模式将设置为字段访问。如果不这样做并注释字段以及带有映射注释的属性(例如@Column),则不会定义行为。
现在明确注释属性访问的getter方法(即告诉持久性提供程序我已将我的默认定义为字段访问,但在这种情况下我想使用属性访问):
@Access(AccessType.PROPERTY)
@Column (name="USER_NAME")
public String getUserName() {
return userName+" from name getter";
}
最后,使用@Transient注释将相应字段标记为瞬态,以便提供者不会尝试使用该字段以及属性来保持状态:
@Transient private String userName;
注意:如果没有合理的理由使用混合模式,您应该坚持使用字段访问模式或属性访问模式;不要在实体中使用这两种模式,因为你想编写干净且易于理解的代码! (我的个人意见)
最后一条评论代码中的以下行:
@Entity (name="USER_DETAILS")
如果您故意使用name
属性来命名实体,那么它可能不是问题;但是如果你试图将实体映射到名为USER_DETAILS
的表,这不是正确的方法;而是使用以下内容:
@Table(name = "USER_DETAILS")
答案 1 :(得分:0)
据我所知,您需要设置hibernate.cfg
配置来告诉hibernate所有属性,例如数据源和映射。在main方法的开头配置如下:
Configuration config = new Configuration().configure("hibernate.cfg.xml");
StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder();
srb.applySettings(config.getProperties());
ServiceRegistry registry = srb.build();
SessionFactory sessionFactory = config.buildSessionFactory(registry);
您的cfg.xml文件类似于:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">YOUR_DRIVER</property>
<property name="hibernate.connection.username">YOUR_USER</property>
<property name="hibernate.connection.password">YOUR_PASSWPRD</property>
<property name="hibernate.connection.url"> YOUR_URL </property>
<property name="hibernate.dialect">SET_YOUR_DIALECT</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Map Entity Class -->
<mapping class="entity.UserDetails"></mapping>
</session-factory>
</hibernate-configuration>
答案 2 :(得分:0)
我在使用 @Column(unique=true) 时遇到了同样的问题,我在 application.properties 上添加了它,它对我有用。
resources/application.properties
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl