【问题标题】:Foreign key is also part of the primary key外键也是主键的一部分
【发布时间】:2010-10-22 08:04:52
【问题描述】:

是否可以在普通 JPA 或 JPA+Hibernate 扩展中使用也是复合主键一部分的外键?

@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;
}

主要:

public class Persister {
public static void main(String[] args) {

First aFirst = new First();

Second aSecond = new Second();
aSecond.b = 300;    
List<Second> scnds = new ArrayList<Second>();
scnds.add(aSecond);

aFirst.seconds = scnds;
aSecond.first = aFirst;


aEntityManager.getTransaction().begin();
aEntityManager.persist(aFirst);
aEntityManager.getTransaction().commit();
}}

问题出在“第二”类中:

如果我在字段“a”中设置“insertable = false, updatable = false”,则会引发异常:

"参数索引超出范围。4 不在有效值 1 和 3 之间"

如果我在@manyToOne 的关系中设置“insertable = false, updatable = false”,它会运行,但在“Second”表的“a”中设置为 0

目标:在 Second.a 中设置 First.a 的生成值。

/////////////////////////

创建数据库的sql:

先建表( 一个整数, 主键(一) );

创建表秒( 一个整数, b 整数, 主键 (a, b) );

第三个创建表( 一个varchar(20), 整数 );

请...帮助

提前感谢

【问题讨论】:

    标签: java database jpa


    【解决方案1】:

    首先,您确定需要吗? ...

    无论如何。我可能会在这里显示我的无知,但我认为您可能非常接近,但事情的顺序不是。

    读取生成的密钥可以这样完成:

    ...
    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();
    

    你读过这个吗?

    Java Persistence : Mapping A Joing Table With Additional Columns

    它不是 JPA,但如果幸运的话,hibernate 可能支持在同一字段中同时设置 @Id 和 @ManyToOne 标记。你试过吗?那会很好,不是吗:-) ...

     @Id  // may not work
     @ManyToOne // may not work
     @JoinColumn(name = "a")
     First a;
    

    哦,那个“a”前缀是什么意思?争论?模糊的 ?矛盾的?企业的东西?

    【讨论】:

    • 谢谢你,我在@manytoone 上尝试了@id,但它似乎不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2015-03-08
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多