Bor*_*yev 9 java hibernate jpa
看来@Basicjava变量上的注释只声明该变量必须保存为具有NOT NULL约束的列.那是对的吗 ?
这篇文章说的@Basic(optional = false) @Column(nullable = false) The @Basic annotation marks the property as not optional on the Java object level. The second setting, nullable = false on the column mapping, is only responsible for the generation of a NOT NULL database constraint. The Hibernate JPA implementation treats both options the same way in any case, so you may as well use only one of the annotations for this purpose.
我很迷惑.这意味着什么 - The @Basic annotation marks the property as not optional on the Java object level.Java级别的属性或变量"可选"如何?
对api元素含义的权威答案当然是api文档,即javadoc.对于@Basic注释,这写道:
最简单的映射到数据库列的类型.Basic注释可以应用于以下任何类型的持久属性或实例变量:Java原始类型,基本类型的包装,String,java.math.BigInteger,java.math.BigDecimal,java.util.Date, java.util.Calendar,java.sql.Date,java.sql.Time,java.sql.Timestamp,byte [],Byte [],char [],Character [],枚举以及任何其他实现java的类型. io.Serializable.
对于这些类型的持久字段和属性,Basic注释的使用是可选的.如果未为此类字段或属性指定基本注释,则将应用基本注释的默认值.
Basic注释的值是什么?Javadoc也解释了它们:
Run Code Online (Sandbox Code Playgroud)public abstract FetchType fetch(可选)定义字段或属性的值是应该延迟加载还是必须急切获取.EAGER策略是持久性提供程序运行时的要求,必须急切地获取该值.LAZY策略是对持久性提供程序运行时的提示.如果未指定,则默认为EAGER.
和
Run Code Online (Sandbox Code Playgroud)public abstract boolean optional(可选)定义字段或属性的值是否为null.这是一个提示,被忽略了原始类型; 它可以用于模式生成.如果未指定,则默认为true.
因此,如果设置optional为false,则当您尝试持久化或更新属性为null的对象时,持久性提供程序可能会抛出异常.如果您的业务规则说null不是合法值,那么这可能很有用.
注意
至少在使用hibernate时,可以使用相应的Bean Validation annotation(@NotNull)更好地表达可空性,因为这个注释既可以被hibernate理解,也可以被应用程序上的其他层使用(例如,在验证用户输入时).
Hibernate JPA实现只会在模式生成方面处理相同的问题,即使用非null约束创建列.
然而,如果非可选字段为null,则使用optional = false也允许Hibernate(我想其他实现)执行检查并在刷新到数据库之前抛出异常.如果没有这个,你只会在尝试插入后抛出异常.
来自Pro JPA:
当可选元素指定为false时,它向提供者指示字段或属性映射可能不为null.当值为null时,API实际上并未定义行为是什么,但提供者可能会选择抛出异常或只是执行其他操作.对于基本映射,它只是一个提示,可以完全忽略.在进行模式生成时,提供程序也可以使用可选元素,因为,如果optional设置为true,则数据库中的列也必须可以为空.
具有optional = false也会影响Hibernate中的实体加载.例如,除非将关联标记为optional = false,否则单端关联总是在Hibernate中急切加载.
有关详细说明,请参阅:https://stackoverflow.com/a/17987718/1356423.
| 归档时间: |
|
| 查看次数: |
13539 次 |
| 最近记录: |