在关系中声明@OneToOne和@NotNull双方是否有效,例如:
class ChangeEntry
{
@OneToOne(cascade=CascadeType.ALL)
@NotNull
ChangeEntryDetails changeEntryDetails;
public void addDetails(ChangeEntryDetails details) {
this.changeEntryDetails = details;
details.setChangeEntry(this);
}
}
class ChangeEntryDetails
{
@OneToOne(cascase=CascadeType.ALL)
@NotNull
ChangeEntry changeEntry;
public void setChangeEntry(ChangeEntry changeEntry)
{
this.changeEntry = changeEntry;
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到任何说这是无效的东西,但似乎在持久性过程中至少有一方必须违反.(例如,如果首先编写changeEntry,则changeEntryDetails将暂时为null).
尝试这个时,我看到一个异常抛出not-null property references a null or transient value.
如果可能的话,我想避免放松约束,因为双方都必须在场.
我正在使用Hibernate和一个由Mysql db支持的Springs.
这是与我用来创建条目的实体类似的实体
@Entity
@Table(name = "my_table") {
@Basic
@Column(name = "my_string", nullable = false)
private String myString;
}
Run Code Online (Sandbox Code Playgroud)
sql定义是
CREATE TABLE `my_table` (
`my_string` varchar(200) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
虽然该表允许空值,但myString列根据JPA注释是不可为空的.这导致了不可预测的行为.
问:在插入时,是否在实体级强制执行不可为空的ALWAYS?或者是否存在可能被忽略的情况
我的期望是所有参赛作品都应该被拒绝.但是通过这种设置,许多条目(> 7000)进入了表格.有时我只能从spring获得DataIntegrityViolation异常
org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: ...; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: ....
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:652)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
....
....
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: …Run Code Online (Sandbox Code Playgroud) 因此,如果某些表缺少主键,那么innodb的行为可能会导致问题.
因此,对于Hibernate,我正在寻找一个键来指定@ElementCollection表上的主键,其中Set为底层数据结构.
我找到了一种使用地图的主键的方法,但它有点奇怪,因为我不需要地图.
我还找到了与@Embeddable相关的答案,但我不需要那种复杂性.我在我的实体中使用Set或Set作为数据结构.
知道如何实现吗?
我想做这个列不能为null但是当我在数据库中插入一个寄存器值null时,这允许我插入.我阅读文档,我不知道为什么不起作用.
@Column(name="QWECOD", nullable = false)
private String qwe;
谢谢
更新:我正在使用Toplink和java org.eclipse.persistence.eclipselink:2.4.2.
我有一个有关的问题javax.validation.constraints.NotNull annotation。在我的项目中,我确实有如下所示的类树:
@Inheritance(strategy = InheritanceType.JOINED)
class Ssss {
@ManyToOne
private Xxxx x;
public Xxxx getXxxx() {
return x;
}
}
@Inheritance(strategy = InheritanceType.JOINED)
class Yyyy extends Ssss {
@Override
//some not important annotations
public Xxxx getXxxx() {
return super.getXxxx();
}
}
@Inheritance(strategy = InheritanceType.JOINED)
class Zzzz extends Ssss {
@Override
//some not important annotations
@NotNull
public Xxxx getXxxx() {
return super.getXxxx();
}
}
Run Code Online (Sandbox Code Playgroud)
这三个类作为三个表存储在数据库中。对于架构创建,我正在使用Hibernate:
hibernate.hbm2ddl.auto=create
Run Code Online (Sandbox Code Playgroud)
它是一个预期的行为,Hibernate对增加NOT NULL对xxxx_object_id存储在父类生成的表场SSSS类似以下内容:??
我找不到有关休眠如何在继承的getter上使用@NotNull的任何相关信息。
有人可以帮我解决这个问题吗?
最好的祝福。 …
在这三个选项中,我应该使用一个或两个或全部三个选项组合来防止空值?
@NotNull
@Column(name = "SOME_VALUE", nullable = false)
@Basic(optional = false)
private String someValue;
Run Code Online (Sandbox Code Playgroud)
请注意,我不认为这与现有问题重复。我看到许多 问题都询问这三个选项的子集,但尚未找到一个询问这三个选项中哪一个适合在现代 JPA/Hibernate 堆栈中使用的问题。
这是我的实体:
@Builder
@Data
@Entity
@Table(name = "audit_log")
public class AuditEventEntity {
@Id
@GeneratedValue
private UUID id;
private long createdEpoch;
@NotNull
@Size(min = 1, max = 128)
private String label;
@NotNull
@Size(min = 1)
private String description;
}
Run Code Online (Sandbox Code Playgroud)
这是我的存储库:
@Repository
public interface AuditEventRepository extends PagingAndSortingRepository<AuditEventEntity, UUID> {
}
Run Code Online (Sandbox Code Playgroud)
当我为存储库编写以下单元测试时,即使“ label”字段为null,保存也会成功!
@DataJpaTest
@RunWith(SpringRunner.class)
public class AuditRepositoryTest {
@Test
public void shouldHaveLabel() {
AuditEventEntity entity = AuditEventEntity.builder()
.createdEpoch(Instant.now().toEpochMilli())
.description(RandomStringUtils.random(1000))
.build();
assertThat(entity.getLabel()).isNullOrEmpty();
AuditEventEntity saved = repository.save(entity);
// Entity saved and didn't get validated!
assertThat(saved.getLabel()).isNotNull(); …Run Code Online (Sandbox Code Playgroud) 根据 hibernate 验证器参考文档 - 第11.1.1 节。数据库模式级验证(https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-checkconstraints-db),
Hibernate ORM 开箱即用,会将您为实体定义的约束转换为映射元数据。例如,如果实体的属性被注释为 @NotNull,则其列将在 Hibernate ORM 生成的 DDL 架构中声明为非 null。
但是当我用 @NotNull 注释我的字段时,我不会自动获得架构级别约束。
我尝试设置Environment.HBM2DDL_AUTO为update和create但两者都无法生成数据库约束。
尽管休眠状态默认设置为hibernate.validator.apply_to_ddl,true我什至尝试手动设置 -
settings.put("hibernate.validator.apply_to_ddl", true);
Run Code Online (Sandbox Code Playgroud)
但这些选项似乎都不适合我。
我的域类
package com.praveen.domain;
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Entity
@Data
public class Stakeholder extends MyPersistent {
@NotNull
private String clientCode;
@NotNull
private String gender;
}
Run Code Online (Sandbox Code Playgroud)
我的持久类
package com.praveen.domain;
import java.io.Serializable;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import lombok.Getter; …Run Code Online (Sandbox Code Playgroud) 嗯,我有一个关于@Basic(可选= false)和@NotNull表示法的问题.
通常,我们会在实体类中编写变量,如下所示:
模拟代码:
@Basic(optional = false)
@NotNull
@Column(name = USERNAME)
private String userName;
Run Code Online (Sandbox Code Playgroud)
上面的表示法描述了对于字段用户名,它不接受NULL值.
通常,@ Basic(可选= false)符号后跟@NotNull表示法,但是如果我想要一个字段,那么就说userID,它是一个自动增量类型,它也是主键,我应该刚写下如下代码?
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = USERID)
private Integer userID;
Run Code Online (Sandbox Code Playgroud)
或者删除@Basic(可选= false)?
编辑
最新代码:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = USERID)
private Integer userID;
Run Code Online (Sandbox Code Playgroud)
还有一个问题是,只有@Basic(可选= false)与@Botic(可选= false)相同,后续是@NotNull吗?
代码如下:
代码1
@Basic(optional = false)
@NotNull
@Column(name …Run Code Online (Sandbox Code Playgroud) 我有几个表的MySql数据库。每个表中的每个字段都不能为空。这就是为什么我被迫对@NotNull我所有标有的Java类中的每个字段使用注释@Entity。我真的必须这样做还是有办法告诉JPA / Hibernate默认将每个字段NotNullable对待吗?
编辑:我也知道@Column(name="something", nullable=false)。但是,它仍然不能解决任何问题-您必须编写nullable=false
我读了这个。但它并没有给ma一个明确的用法回答。
当我创建表和列时。
情况1:
@Column(nullable = false, length = 14)
@NotNull
private String something;
Run Code Online (Sandbox Code Playgroud)
案例2:
@Column(length = 14)
@NotNull
private String something;
Run Code Online (Sandbox Code Playgroud)
不是一样吗?我的意思是@NotNull 会更早抛出异常,所以有理由做 nullable = false 列吗?
java ×10
jpa ×9
hibernate ×7
orm ×4
spring ×2
validation ×2
jsr ×1
mysql ×1
mysql-5.5 ×1
persistence ×1
postgresql ×1
spring-boot ×1
spring-data ×1