java - 与 Hibernate-JPA 的一对一关系

标签 java hibernate jpa-2.0 java-ee-5

我在提交实体时遇到以下错误。根据错误,我必须为实体分配一个 id,但我希望它必须由 JPA 本身处理。

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): alarm.ServiceAlarmConfEntity
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
    at alarm.Test.main(Test.java:32)
Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): alarm.ServiceAlarmConfEntity
    at org.hibernate.id.Assigned.generate(Assigned.java:53)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
    at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)

我有两个具有一对一关系的实体。

@Entity(name ="services")
@Table(name = "services")
public class Service implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Column(name = "label")
    private String label;
    @Column(name = "schemapath")
    private String schemapath;
    @Column(name = "customizedPath")
    private String customizedPath;
    @Column(name = "birimId")
    private Integer birimId;   
    @Column(name = "alarmthresholdXML")
    private String alarmthresholdXML;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "service", fetch = FetchType.LAZY)
    private ServiceAlarmConfEntity serviceAlarmConfEntity;
<小时/>
@Entity(name ="service_alarm_conf")
@Table(name = "service_alarm_conf")
public class ServiceAlarmConfEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "service_id")
    private Integer serviceId;
    @Lob
    @Column(name = "alarmthresholdXML")
    private String alarmthresholdXML;
    @Column(name = "alarmCheckEnable")
    private Integer alarmCheckEnable;
    @Column(name = "alarmDataTransferTimeInSeconds")
    private Integer alarmDataTransferTimeInSeconds;
    @JoinColumn(name = "service_id", referencedColumnName = "id", insertable = false, updatable = false)
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    private Service service;

主类:

package alarm;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Test {

public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("alarm");

    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    Service service = new Service();
    service.setLabel("Test1");
    service.setBirimId(16);
    service.setSchemapath("test1");
    service.setCustomizedPath("Test1");


    ServiceAlarmConfEntity serviceAlarmConfEntity = new ServiceAlarmConfEntity();
    serviceAlarmConfEntity.setAlarmCheckEnable(1);
    serviceAlarmConfEntity.setAlarmthresholdXML("alarmThresholdXML");
    serviceAlarmConfEntity.setService(service);


    service.setServiceAlarmConfEntity(serviceAlarmConfEntity);

    tx.begin();
    em.persist(service);        
    tx.commit();
    em.close();
}

}

更新:

ServiceAlarmConfEntity 配置如下。并且它有效。

   @MapsId
   @JoinColumn(name = "service_id", referencedColumnName = "id")
   @OneToOne(optional = false, fetch = FetchType.LAZY)
   private Service service;

最佳答案

只有使用 @GenerateValue 注释时,才会自动生成 ID。但事实并非如此。

编辑:

the documentation 中所述,让子实体共享其父实体的 ID 的标准和推荐方法如下:

public class ServiceAlarmConfEntity {
    @Id
    private Integer serviceId;

    @MapsId 
    @OneToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "service_id")
    private Service service;

    ...
}

关于java - 与 Hibernate-JPA 的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903466/

相关文章:

java - 错误 : syntax error at or near "user"

java - 异常 + 迭代器结束信号 : why is it bad in Java and normal in Python?

java - 如何在同一 hibernate session 中从数据库表获取更新的值

hibernate - JPA Hibernate 调用 Postgres 函数无效返回映射异常 :

jpa-2.0 - 在 eclipselink 中执行 UPDATE 而无需 SELECT

java - 有没有一种方法可以更改/编辑导入到 Android Studio 的图标,就像编辑已预安装的图标一样?

java - 为什么 findViewById(android.R.id.tabhost) 返回 null?

java - hibernate session.save() 插入与对象不同的值

java - 如何在jpql中为in-clause设置集合项?

java - JPA 查询存在于