首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Hibernate-JPA的一对一关系

与Hibernate-JPA的一对一关系
EN

Stack Overflow用户
提问于 2013-06-03 18:32:54
回答 1查看 4.5K关注 0票数 1

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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
@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;
代码语言:javascript
复制
@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;

主要班:

代码语言:javascript
复制
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配置如下。而且起作用了。

代码语言:javascript
复制
   @MapsId
   @JoinColumn(name = "service_id", referencedColumnName = "id")
   @OneToOne(optional = false, fetch = FetchType.LAZY)
   private Service service;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-03 18:34:41

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

编辑:

正如在文献资料中解释的那样,让子实体共享父实体的ID的标准和推荐方法如下:

代码语言:javascript
复制
public class ServiceAlarmConfEntity {
    @Id
    private Integer serviceId;

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

    ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16903466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档