Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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
Jpa 2.0 无法使@ManyToOne关系为空_Jpa 2.0_Jboss7.x_Nullable_Postgresql 9.1_Many To One - Fatal编程技术网

Jpa 2.0 无法使@ManyToOne关系为空

Jpa 2.0 无法使@ManyToOne关系为空,jpa-2.0,jboss7.x,nullable,postgresql-9.1,many-to-one,Jpa 2.0,Jboss7.x,Nullable,Postgresql 9.1,Many To One,我有一个多对一关系,我希望可以为空: @ManyToOne(optional = true) @JoinColumn(name = "customer_id", nullable = true) private Customer customer; 不幸的是,JPA一直将数据库中的列设置为NOTNULL。有人能解释一下吗?有没有办法让它发挥作用?注意,我使用JBoss7、JPA2.0和Hibernate作为持久性提供程序和PostgreSQL 9.1数据库 编辑: 我找到了问题的原因。显然,这

我有一个多对一关系,我希望可以为空:

@ManyToOne(optional = true)
@JoinColumn(name = "customer_id", nullable = true)
private Customer customer;
不幸的是,JPA一直将数据库中的列设置为NOTNULL。有人能解释一下吗?有没有办法让它发挥作用?注意,我使用JBoss7、JPA2.0和Hibernate作为持久性提供程序和PostgreSQL 9.1数据库

编辑

我找到了问题的原因。显然,这是由于我在引用的实体
Customer
中定义主键的方式:

@Entity
@Table
public class Customer { 
    @Id
    @GeneratedValue
    @Column(columnDefinition="serial")
    private int id;
}
似乎对主键使用
@Column(columnDefinition=“serial”)
会自动将引用它的外键设置为数据库中的
非NULL
。当将列类型指定为
serial
时,这真的是预期的行为吗?在这种情况下,是否存在启用可为空外键的变通方法

提前谢谢你。

这太奇怪了

在JPA中,默认情况下可为null的参数为true。我一直在使用这种配置,效果很好。如果您尝试保存实体,则应该会成功

是否尝试删除为此关系创建的表?也许你有那个列的旧表

或者您应该尝试在其他代码块上找到解决方案,因为这是正确的配置

注意:我已经在带有JPA2和Hibernate的PostgreSQL上尝试了这种配置

编辑

在这种情况下,您可以尝试一下主键的不同定义

例如,您可以使用如下定义:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column()
private Long id;
@ManyToOne
@JoinColumn(columnDefinition="integer", name="customer_id")
private Customer customer;
postgresql将生成

id bigint NOT NULL
-- with constraint
CONSTRAINT some_table_pkey PRIMARY KEY (id)

如果这足够好,您可以尝试此解决方案

我找到了解决问题的办法。在entity
Customer
中定义主键的方式很好,问题在于外键声明。应该这样宣布:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column()
private Long id;
@ManyToOne
@JoinColumn(columnDefinition="integer", name="customer_id")
private Customer customer;
事实上,如果省略属性
columnDefinition=“integer”
,则默认情况下,外键将设置为源列:具有自己序列的非空序列。这当然不是我们想要的,因为我们只想引用自动递增的ID,而不是创建一个新的ID

此外,正如我在执行一些测试时观察到的那样,似乎还需要属性
name=customer\u id
。否则,外键列仍将设置为源列。在我看来,这是一种奇怪的行为。欢迎评论或其他信息来澄清这一点


最后,此解决方案的优点是,ID由数据库生成(不是由JPA生成),因此,在手动插入数据或通过脚本插入数据时,我们不必担心此问题,这在数据迁移或维护过程中经常发生。

我遇到此问题,但我能够通过以下方式解决此问题:

@ManyToOne
@JoinColumn(nullable = true)
private Customer customer;

在事务中声明
@ManyToOne(optional=true)

可能会出现问题,但在执行保存操作之前,请将外键列值显式设置为null。在这种休眠状态下,永远不要对这个外键相关的表执行select查询,也不要抛出异常“在刷新之前保存临时实例”。如果要有条件地设置“null值”,则执行1。使用repo调用get/find 2获取并设置值。然后检查获取的条件值,并相应地将其设置为null

// Transaction Start Optional<Customer> customerObject = customerRepository.findByCustomerId(customer.getCustomerId()) if(customerObject.isPresent())yourEnclosingEntityObject.setCustomer(customerObject)} else {yourEnclosingEntityObject.setCustomer(null)} yourEnclosingEntityObjectRepository.save(yourEnclosingEntityObject) // Transaction End //事务开始 可选customerObject=customerRepository.findByCustomerId(customer.getCustomerId()) 如果(customerObject.isPresent())您的EnclosuringTityObject.setCustomer(customerObject)} else{yourEnclosuringTityObject.setCustomer(null)} YourEnclosuringTityObject存储库.save(YourEnclosuringTityObject)
//这确实是我考虑过的一个解决方案。不幸的是,这不能从数据库本身生成ID,这是我在手动插入数据时需要的功能(例如使用hibernate的import.sql)。幸运的是,我想我即将找到解决办法。我正在做一些测试,如果成功,我会发布解决方案。感谢您的帮助。
nullable=false
<代码>错误?为什么
false
,而不是
true
?它肯定应该是
nullable=true
nullable默认设置为true,不需要定义它。生活中总是有一个变通方法,如果知道如何才能看到编辑的开始,那就太好了,我已经标记了前面的答案[“有一个变通方法”]这不是答案。谢谢你的帮助,但如果你下次一次完成这项工作,就更好了,这样可以避免旗帜和落选。再见!我是一个新的贡献者。好啊行