Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在hibernate 3中映射派生标识?_Java_Hibernate Mapping_Hibernate3 - Fatal编程技术网

Java 如何在hibernate 3中映射派生标识?

Java 如何在hibernate 3中映射派生标识?,java,hibernate-mapping,hibernate3,Java,Hibernate Mapping,Hibernate3,我有以下情况: @Entity class A{ @Id @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID") private Long aId; @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=

我有以下情况:

@Entity
class A{ 
  @Id
  @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
  private Long aId;
  @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
  private B b;
  ...
}
@Entity
class B{
  @Id
  private A a;
  ...
}
换句话说:a和B之间有一个一对一的关联。B是一个弱实体,它的Id是从a类派生的

我已经测试了一些解决方案,如上面提到的在@OneToOne下添加@PrimaryKeyJoinColumn。但是我得到了这个错误:“org.hibernate.id.IdentifierGenerationException:在调用save()之前必须手动分配这个类的id:B”
我不知道它是否与本例相关,但我使用的是Oracle 11g

已更新

我想我是对的。以下是我的问题的实际状态:

@Entity
class A{ 
  @Id
  @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID")
  private Long aId;
  @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL)
  @PrimaryKeyJoinColumn(name="aId")
  private B b;
  ...
}
@Entity
class B{
  @Id
  @OneToOne
  @JoinColumn(name="aId)
  private A a;
  ...
}
现在的错误有点不同:

java.sql.SQLException: ORA-00904: "B"."A": invalid identifier  

它正在尝试在表B中查找列A(而不是AID)。我不知道如何指定列名为B.AID而不是B.A。

您在实体B上尝试过吗

@Entity class B {
  @Id @OneToOne 
  @JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
  private A a;
  ....
}

你在实体B上试过吗

@Entity class B {
  @Id @OneToOne 
  @JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
  private A a;
  ....
}

接下来我解决了我的问题

正确答案是:

@Entity
public class A {

  @Id
  @GeneratedValue
  @Column(name = "aId")
  private Long id;

  @OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a")
  private B b;
  ... 
} 


@Entity
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")})
public class B {

  @Id
  @GeneratedValue(generator = "a-primarykey")
  @Column(name = "aId")
  private Long id;

  @OneToOne
  @PrimaryKeyJoinColumn
  private A a;
  ...
} 

接下来我解决了我的问题

正确答案是:

@Entity
public class A {

  @Id
  @GeneratedValue
  @Column(name = "aId")
  private Long id;

  @OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a")
  private B b;
  ... 
} 


@Entity
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")})
public class B {

  @Id
  @GeneratedValue(generator = "a-primarykey")
  @Column(name = "aId")
  private Long id;

  @OneToOne
  @PrimaryKeyJoinColumn
  private A a;
  ...
} 

对谢谢你的回答,但它不起作用,同样的错误。正如文章所说,似乎不可能将级联与派生标识一起使用……是的。谢谢你的回答,但它不起作用,同样的错误。正如文章所说,似乎不可能将级联与派生标识一起使用……如果您使用Hibernate 3.5,这可能会有所帮助:如果您使用Hibernate 3.5,这可能会有帮助: