Java 外键也是主键的一部分
在普通JPA或JPA+Hibernate扩展中,是否可以使用也是复合主键一部分的外键Java 外键也是主键的一部分,java,database,jpa,Java,Database,Jpa,在普通JPA或JPA+Hibernate扩展中,是否可以使用也是复合主键一部分的外键 @TableGenerator(name = "trial", table = "third", pkColumnName = "a" , valueColumnName = "b", pkColumnValue = "first") @Entity public class First{ @Id @GeneratedValue(strategy = Generation
@TableGenerator(name = "trial", table = "third",
pkColumnName = "a" , valueColumnName = "b", pkColumnValue = "first")
@Entity
public class First{
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "trial")
protected int a;
@OneToMany(mappedBy ="first", cascade = CascadeType.PERSIST)
@JoinColumn(name = "a")
protected List<Second> seconds;
}
class IDC implements Serializable{
//@Column(name = "a", insertable = false, updatable = false)
protected int a;
protected int b;
}
@Entity
@IdClass(IDC.class)
public class Second{
@Id
//@Column(name = "a", insertable = false, updatable = false)
protected int a;
@Id
protected int b;
@ManyToOne
@JoinColumn(name = "a"/*, insertable = false, updatable = false*/)
First first;
}
@TableGenerator(name=“trial”,table=“third”,
pkColumnName=“a”,valueColumnName=“b”,pkColumnValue=“first”)
@实体
公共类第一{
@身份证
@GeneratedValue(策略=GenerationType.TABLE,generator=“试用”)
受保护的INTA;
@OneToMany(mappedBy=“first”,cascade=CascadeType.PERSIST)
@JoinColumn(name=“a”)
保护列表秒;
}
类IDC实现了可序列化{
//@列(name=“a”,insertable=false,updateable=false)
受保护的INTA;
受保护的int b;
}
@实体
@IdClass(IDC.class)
公共类第二{
@身份证
//@列(name=“a”,insertable=false,updateable=false)
受保护的INTA;
@身份证
受保护的int b;
@许多酮
@JoinColumn(name=“a”/*,insertable=false,updateable=false*/)
首先;
}
主要内容:
公共类持久器{
公共静态void main(字符串[]args){
First affirst=新的First();
Second aSecond=新的第二个();
第二个b=300;
List scnds=new ArrayList();
添加(一秒钟);
第一秒=scnds;
第二个第一个=第一个;
aEntityManager.getTransaction().begin();
坚持(第一次);
aEntityManager.getTransaction().commit();
}}
问题在第二节课上:
如果我在字段“a”处设置“insertable=false,Updateable=false”,则会引发异常:
“参数索引超出范围。4不在有效值1和3之间”
如果我在@manyToOne的关系中设置“insertable=false,updateable=false”,那么它将运行,但在表“Second”的“a”中设置0
目标:在Second.a中设置First.a的生成值
/////////////////////////////
创建数据库的sql语句:
首先创建表(
整数,
主键(a)
);
第二次创建表(
整数,
b int,
主键(a,b)
);
创建第三个表(
瓦查尔(20岁),
b int
);
请。。。帮助
首先,你确定你需要吗 无论如何。我可能在这里表示我的无知,但我认为你可能很接近,但事情的顺序不是这样的 读取生成的密钥可以这样做:
...
First first = new First();
entityManager.save(first); //<- the id is updated
Second second = new Second();
second.setB(300);
second.setA(first.getA());
first.setSeconds( new ArrayList());
first.getSeconds().add(second);
entityManager.save(second);
entityManager.getTransaction().commit();
哦,“a”前缀是什么意思?论点模棱两可的?矛盾的一件有进取心的事 Thanx对于你,我在@manytone上尝试了@id,但它似乎不起作用。
...
First first = new First();
entityManager.save(first); //<- the id is updated
Second second = new Second();
second.setB(300);
second.setA(first.getA());
first.setSeconds( new ArrayList());
first.getSeconds().add(second);
entityManager.save(second);
entityManager.getTransaction().commit();
@Id // may not work
@ManyToOne // may not work
@JoinColumn(name = "a")
First a;