Hibernate SVN: r20219 - validator/trunk/hibernate-validator/src/main/docbook/en-US/modules.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-08-22 12:21:14 -0400 (Sun, 22 Aug 2010)
New Revision: 20219
Modified:
validator/trunk/hibernate-validator/src/main/docbook/en-US/modules/integration.xml
Log:
correct typo
Modified: validator/trunk/hibernate-validator/src/main/docbook/en-US/modules/integration.xml
===================================================================
--- validator/trunk/hibernate-validator/src/main/docbook/en-US/modules/integration.xml 2010-08-22 15:49:15 UTC (rev 20218)
+++ validator/trunk/hibernate-validator/src/main/docbook/en-US/modules/integration.xml 2010-08-22 16:21:14 UTC (rev 20219)
@@ -152,7 +152,7 @@
linkend="validator-checkconstraints-orm-hibernateevent" /> can in this
case be configured in <filename>persistence.xml</filename>.
<filename>persistence.xml</filename> also defines a node validation-mode
- while can be set to <constant>AUTO</constant>,
+ which can be set to <constant>AUTO</constant>,
<constant>CALLBACK</constant>, <constant>NONE</constant>. The default is
<constant>AUTO</constant>.</para>
13 years, 8 months
Hibernate SVN: r20218 - validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules.
by hibernate-commits@lists.jboss.org
Author: stliu
Date: 2010-08-22 11:49:15 -0400 (Sun, 22 Aug 2010)
New Revision: 20218
Modified:
validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/customconstraints.po
validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/xmlconfiguration.po
Log:
HV-351 translation
Modified: validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/customconstraints.po
===================================================================
--- validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/customconstraints.po 2010-08-22 10:28:50 UTC (rev 20217)
+++ validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/customconstraints.po 2010-08-22 15:49:15 UTC (rev 20218)
@@ -6,7 +6,7 @@
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
"POT-Creation-Date: 2010-07-06 14:46+0000\n"
-"PO-Revision-Date: 2010-08-20 00:04+0830\n"
+"PO-Revision-Date: 2010-08-21 02:16+0830\n"
"Last-Translator: Strong Liu <stliu(a)hibernate.org>\n"
"Language-Team: none\n"
"MIME-Version: 1.0\n"
@@ -101,13 +101,13 @@
#: customconstraints.xml:74
#, no-c-format
msgid "Now we can define the actual constraint annotation. If you've never designed an annotation before, this may look a bit scary, but actually it's not that hard:"
-msgstr ""
+msgstr "现在我们可以来定义真正的约束标注了. 如果你以前没有创建过标注(annotation)的话,那么这个可能看起来有点吓人, 可是其实没有那么难的 :)"
#. Tag: title
#: customconstraints.xml:79
#, no-c-format
msgid "Defining CheckCase constraint annotation"
-msgstr ""
+msgstr "定义一个CheckCase的约束标注"
#. Tag: programlisting
#: customconstraints.xml:81
@@ -141,36 +141,63 @@
"\n"
"}"
msgstr ""
+"package com.mycompany;\n"
+"\n"
+"import static java.lang.annotation.ElementType.*;\n"
+"import static java.lang.annotation.RetentionPolicy.*;\n"
+"\n"
+"import java.lang.annotation.Documented;\n"
+"import java.lang.annotation.Retention;\n"
+"import java.lang.annotation.Target;\n"
+"\n"
+"import javax.validation.Constraint;\n"
+"import javax.validation.Payload;\n"
+"\n"
+"@Target( { METHOD, FIELD, ANNOTATION_TYPE })\n"
+"@Retention(RUNTIME)\n"
+"@Constraint(validatedBy = CheckCaseValidator.class)\n"
+"@Documented\n"
+"public @interface CheckCase {\n"
+"\n"
+" String message() default \"{com.mycompany.constraints.checkcase}\";\n"
+"\n"
+" Class<?>[] groups() default {};\n"
+"\n"
+" Class<? extends Payload>[] payload() default {};\n"
+" \n"
+" CaseMode value();\n"
+"\n"
+"}"
#. Tag: para
#: customconstraints.xml:84
#, no-c-format
msgid "An annotation type is defined using the <code>@interface</code> keyword. All attributes of an annotation type are declared in a method-like manner. The specification of the Bean Validation API demands, that any constraint annotation defines"
-msgstr ""
+msgstr "一个标注(annotation) 是通过<code>@interface</code>关键字来定义的. 这个标注中的属性是声明成类似方法的样式的. 根据Bean Validation API 规范的要求"
#. Tag: para
#: customconstraints.xml:91
#, no-c-format
msgid "an attribute <property>message</property> that returns the default key for creating error messages in case the constraint is violated"
-msgstr ""
+msgstr "<property>message</property>属性, 这个属性被用来定义默认得消息模版, 当这个约束条件被验证失败的时候,通过此属性来输出错误信息."
#. Tag: para
#: customconstraints.xml:97
#, no-c-format
msgid "an attribute <property>groups</property> that allows the specification of validation groups, to which this constraint belongs (see <xref linkend=\"validator-usingvalidator-validationgroups\"/>). This must default to an empty array of type <classname>Class<?></classname>."
-msgstr ""
+msgstr "<property>groups</property> 属性, 用于指定这个约束条件属于哪(些)个校验组(请参考<xref linkend=\"validator-usingvalidator-validationgroups\"/>). 这个的默认值必须是<classname>Class<?></classname>类型到空到数组."
#. Tag: para
#: customconstraints.xml:105
#, no-c-format
msgid "an attribute <classname>payload</classname> that can be used by clients of the Bean Validation API to assign custom payload objects to a constraint. This attribute is not used by the API itself."
-msgstr ""
+msgstr "<classname>payload</classname> 属性, Bean Validation API 的使用者可以通过此属性来给约束条件指定严重级别. 这个属性并不被API自身所使用."
#. Tag: para
#: customconstraints.xml:109
#, no-c-format
msgid "An example for a custom payload could be the definition of a severity."
-msgstr ""
+msgstr "通过payload属性来指定默认错误严重级别的示例"
#. Tag: programlisting
#: customconstraints.xml:112
@@ -191,66 +218,80 @@
" // ...\n"
"}"
msgstr ""
+"public class Severity {\n"
+" public static class Info extends Payload {};\n"
+" public static class Error extends Payload {};\n"
+"}\n"
+"\n"
+"public class ContactDetails {\n"
+" @NotNull(message=\"Name is mandatory\", payload=Severity.Error.class)\n"
+" private String name;\n"
+"\n"
+" @NotNull(message=\"Phone number not specified, but not mandatory\", payload=Severity.Info.class)\n"
+" private String phoneNumber;\n"
+"\n"
+" // ...\n"
+"}"
#. Tag: para
#: customconstraints.xml:114
#, no-c-format
msgid "Now a client can after the validation of a <classname>ContactDetails</classname> instance access the severity of a constraint using <methodname>ConstraintViolation.getConstraintDescriptor().getPayload()</methodname> and adjust its behaviour depending on the severity."
-msgstr ""
+msgstr "这样, 在校验完一个<classname>ContactDetails</classname> 的示例之后, 你就可以通过调用<methodname>ConstraintViolation.getConstraintDescriptor().getPayload()</methodname>来得到之前指定到错误级别了,并且可以根据这个信息来决定接下来到行为."
#. Tag: para
#: customconstraints.xml:123
#, no-c-format
msgid "Besides those three mandatory attributes (<property>message</property>, <property>groups</property> and <property>payload</property>) we add another one allowing for the required case mode to be specified. The name <property>value</property> is a special one, which can be omitted upon using the annotation, if it is the only attribute specified, as e.g. in <code>@CheckCase(CaseMode.UPPER)</code>."
-msgstr ""
+msgstr "除了这三个强制性要求的属性(<property>message</property>, <property>groups</property> 和 <property>payload</property>) 之外, 我们还添加了一个属性用来指定所要求到字符串模式. 此属性的名称<property>value</property>在annotation的定义中比较特殊, 如果只有这个属性被赋值了的话, 那么, 在使用此annotation到时候可以忽略此属性名称, 即<code>@CheckCase(CaseMode.UPPER)</code>."
#. Tag: para
#: customconstraints.xml:131
#, no-c-format
msgid "In addition we annotate the annotation type with a couple of so-called meta annotations:"
-msgstr ""
+msgstr "另外, 我们还给这个annotation标注了一些(所谓的) 元标注( 译注: 或\"元模型信息\"?, \"meta annotatioins\"): "
#. Tag: para
#: customconstraints.xml:136
#, no-c-format
msgid "<code>@Target({ METHOD, FIELD, ANNOTATION_TYPE })</code>: Says, that methods, fields and annotation declarations may be annotated with @CheckCase (but not type declarations e.g.)"
-msgstr ""
+msgstr "<code>@Target({ METHOD, FIELD, ANNOTATION_TYPE })</code>: 表示@CheckCase 可以被用在方法, 字段或者annotation声明上."
#. Tag: para
#: customconstraints.xml:142
#, no-c-format
msgid "<code>@Retention(RUNTIME)</code>: Specifies, that annotations of this type will be available at runtime by the means of reflection"
-msgstr ""
+msgstr "<code>@Retention(RUNTIME)</code>: 表示这个标注信息是在运行期通过反射被读取的."
#. Tag: para
#: customconstraints.xml:148
#, no-c-format
msgid "<code>@Constraint(validatedBy = CheckCaseValidator.class)</code>: Specifies the validator to be used to validate elements annotated with @CheckCase"
-msgstr ""
+msgstr "<code>@Constraint(validatedBy = CheckCaseValidator.class)</code>: 指明使用那个校验器(类) 去校验使用了此标注的元素."
#. Tag: para
#: customconstraints.xml:154
#, no-c-format
msgid "<code>@Documented</code>: Says, that the use of <code>@CheckCase</code> will be contained in the JavaDoc of elements annotated with it"
-msgstr ""
+msgstr "<code>@Documented</code>: 表示在对使用了<code>@CheckCase</code>的类进行javadoc操作到时候, 这个标注会被添加到javadoc当中."
#. Tag: title
#: customconstraints.xml:162
#, no-c-format
msgid "The constraint validator"
-msgstr ""
+msgstr "约束校验器"
#. Tag: para
#: customconstraints.xml:165
#, no-c-format
msgid "Next, we need to implement a constraint validator, that's able to validate elements with a <classname>@CheckCase</classname> annotation. To do so, we implement the interface ConstraintValidator as shown below:"
-msgstr ""
+msgstr "接下来, 我们需要实现一个约束验证器, 它是被用来校验应用了<classname>@CheckCase</classname>标注到元素到. 如下面例子所示, 这个验证器需要实现ConstraintValidator接口."
#. Tag: title
#: customconstraints.xml:171
#, no-c-format
msgid "Implementing a constraint validator for the constraint <classname>CheckCase</classname>"
-msgstr ""
+msgstr "约束条件<classname>CheckCase</classname>的验证器"
#. Tag: programlisting
#: customconstraints.xml:174
@@ -282,48 +323,73 @@
"\n"
"}"
msgstr ""
+"package com.mycompany;\n"
+"\n"
+"import javax.validation.ConstraintValidator;\n"
+"import javax.validation.ConstraintValidatorContext;\n"
+"\n"
+"public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {\n"
+"\n"
+" private CaseMode caseMode;\n"
+"\n"
+" public void initialize(CheckCase constraintAnnotation) {\n"
+" this.caseMode = constraintAnnotation.value();\n"
+" }\n"
+"\n"
+" public boolean isValid(String object, ConstraintValidatorContext constraintContext) {\n"
+"\n"
+" if (object == null)\n"
+" return true;\n"
+"\n"
+" if (caseMode == CaseMode.UPPER)\n"
+" return object.equals(object.toUpperCase());\n"
+" else\n"
+" return object.equals(object.toLowerCase());\n"
+" }\n"
+"\n"
+"}"
#. Tag: para
#: customconstraints.xml:177
#, no-c-format
msgid "The <classname>ConstraintValidator</classname> interface defines two type parameters, which we set in our implementation. The first one specifies the annotation type to be validated (in our example <classname>CheckCase</classname>), the second one the type of elements, which the validator can handle (here <classname>String</classname>)."
-msgstr ""
+msgstr "<classname>ConstraintValidator</classname>定义了两个泛型参数, 第一个是这个校验器所服务到标注类型(在我们的例子中即<classname>CheckCase</classname>), 第二个这个校验器所支持到被校验元素到类型 (即<classname>String</classname>)."
#. Tag: para
#: customconstraints.xml:184
#, no-c-format
msgid "In case a constraint annotation is allowed at elements of different types, a <classname>ConstraintValidator</classname> for each allowed type has to be implemented and registered at the constraint annotation as shown above."
-msgstr ""
+msgstr "如果一个约束标注支持多种类型到被校验元素的话, 那么需要为每个所支持的类型定义一个<classname>ConstraintValidator</classname>,并且注册到约束标注中."
#. Tag: para
#: customconstraints.xml:189
#, no-c-format
msgid "The implementation of the validator is straightforward. The <methodname>initialize()</methodname> method gives us access to the attribute values of the annotation to be validated. In the example we store the <classname>CaseMode</classname> in a field of the validator for further usage."
-msgstr ""
+msgstr "这个验证器的实现就很平常了, <methodname>initialize()</methodname> 方法传进来一个所要验证的标注类型的实例, 在本例中, 我们通过此实例来获取其value属性的值,并将其保存为<classname>CaseMode</classname>类型的成员变量供下一步使用."
#. Tag: para
#: customconstraints.xml:195
#, no-c-format
msgid "In the <methodname>isValid()</methodname> method we implement the logic, that determines, whether a <classname>String</classname> is valid according to a given <classname>@CheckCase</classname> annotation or not. This decision depends on the case mode retrieved in <classname>initialize()</classname>. As the Bean Validation specification recommends, we consider <code>null</code> values as being valid. If <code>null</code> is not a valid value for an element, it should be annotated with <code>@NotNull</code> explicitly."
-msgstr ""
+msgstr "<methodname>isValid()</methodname>是实现真正的校验逻辑的地方, 判断一个给定的<classname>String</classname>对于<classname>@CheckCase</classname>这个约束条件来说是否是合法的, 同时这还要取决于在<classname>initialize()</classname>中获得的大小写模式. 根据Bean Validation中所推荐的做法, 我们认为<code>null</code>是合法的值. 如果<code>null</code>对于这个元素来说是不合法的话,那么它应该使用<code>@NotNull</code>来标注."
#. Tag: title
#: customconstraints.xml:205
#, no-c-format
msgid "The ConstraintValidatorContext"
-msgstr ""
+msgstr "ConstraintValidatorContext"
#. Tag: para
#: customconstraints.xml:207
#, no-c-format
msgid "relies on the default error message generation by just returning <constant>true</constant> or <constant>false</constant> from the <methodname>isValid</methodname> call. Using the passed <classname>ConstraintValidatorContext</classname> object it is possible to either add additional error messages or completely disable the default error message generation and solely define custom error messages. The <classname>ConstraintValidatorContext</classname> API is modeled as fluent interface and is best demonstrated with an example:"
-msgstr ""
+msgstr "中的<methodname>isValid</methodname>使用了约束条件中定义的错误消息模板, 然后返回一个<constant>true</constant> 或者 <constant>false</constant>. 通过使用传入的<classname>ConstraintValidatorContext</classname>对象, 我们还可以给约束条件中定义的错误信息模板来添加额外的信息或者完全创建一个新的错误信息模板. "
#. Tag: title
#: customconstraints.xml:219
#, no-c-format
msgid "Use of ConstraintValidatorContext to define custom error messages"
-msgstr ""
+msgstr "使用ConstraintValidatorContext来自定义错误信息"
#. Tag: programlisting
#: customconstraints.xml:222
@@ -364,18 +430,52 @@
"\n"
"}"
msgstr ""
+"package com.mycompany;\n"
+"\n"
+"import javax.validation.ConstraintValidator;\n"
+"import javax.validation.ConstraintValidatorContext;\n"
+"\n"
+"public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {\n"
+"\n"
+" private CaseMode caseMode;\n"
+"\n"
+" public void initialize(CheckCase constraintAnnotation) {\n"
+" this.caseMode = constraintAnnotation.value();\n"
+" }\n"
+"\n"
+" public boolean isValid(String object, ConstraintValidatorContext constraintContext) {\n"
+"\n"
+" if (object == null)\n"
+" return true;\n"
+" \n"
+" boolean isValid;\n"
+" if (caseMode == CaseMode.UPPER) {\n"
+" isValid = object.equals(object.toUpperCase());\n"
+" }\n"
+" else {\n"
+" isValid = object.equals(object.toLowerCase());\n"
+" }\n"
+" \n"
+" if(!isValid) {\n"
+" constraintContext.disableDefaultConstraintViolation();\n"
+" constraintContext.buildConstraintViolationWithTemplate( \"{com.mycompany.constraints.CheckCase.message}\" ).addConstraintViolation();\n"
+" }\n"
+" return result;\n"
+" }\n"
+"\n"
+"}"
#. Tag: para
#: customconstraints.xml:225
#, no-c-format
msgid "shows how you can disable the default error message generation and add a custom error message using a specified message template. In this example the use of the <classname>ConstraintValidatorContext</classname> results in the same error message as the default error message generation."
-msgstr ""
+msgstr "演示了如果创建一个新的错误信息模板来替换掉约束条件中定义的默认的. 在本例中, 实际上通过调用<classname>ConstraintValidatorContext</classname>达到了一个使用默认消息模板的效果."
#. Tag: para
#: customconstraints.xml:231
#, no-c-format
msgid "It is important to end each new constraint violation with <methodname>addConstraintViolation</methodname>. Only after that the new constraint violation will be created."
-msgstr ""
+msgstr "在创建新的constraint violation的时候一定要记得调用<methodname>addConstraintViolation</methodname>, 只有这样, 这个新的constraint violation才会被真正的创建."
#. Tag: para
#: customconstraints.xml:236
@@ -405,54 +505,65 @@
" return isValid;\n"
"}"
msgstr ""
+"public boolean isValid(Group group, ConstraintValidatorContext constraintValidatorContext) {\n"
+" boolean isValid = false;\n"
+" ...\n"
+"\n"
+" if(!isValid) {\n"
+" constraintValidatorContext\n"
+" .buildConstraintViolationWithTemplate( \"{my.custom.template}\" )\n"
+" .addNode( \"myProperty\" ).addConstraintViolation();\n"
+" }\n"
+" return isValid;\n"
+"}"
#. Tag: title
#: customconstraints.xml:254
#, no-c-format
msgid "The error message"
-msgstr ""
+msgstr "校验错误信息"
#. Tag: para
#: customconstraints.xml:256
#, no-c-format
msgid "Finally we need to specify the error message, that shall be used, in case a <classname>@CheckCase</classname> constraint is violated. To do so, we add the following to our custom <filename>ValidationMessages.properties</filename> (see also <xref linkend=\"section-message-interpolation\"/>)"
-msgstr ""
+msgstr "最后, 我们还需要指定如果<classname>@CheckCase</classname>这个约束条件验证的时候,没有通过的话的校验错误信息. 我们可以添加下面的内容到我们项目自定义的<filename>ValidationMessages.properties</filename> (参考 <xref linkend=\"section-message-interpolation\"/>)文件中."
#. Tag: title
#: customconstraints.xml:263
#, no-c-format
msgid "Defining a custom error message for the <classname>CheckCase</classname> constraint"
-msgstr ""
+msgstr "为<classname>CheckCase</classname>约束定义一个错误信息"
#. Tag: programlisting
#: customconstraints.xml:266
#, no-c-format
msgid "com.mycompany.constraints.CheckCase.message=Case mode must be {value}."
-msgstr ""
+msgstr "com.mycompany.constraints.CheckCase.message=Case mode must be {value}."
#. Tag: para
#: customconstraints.xml:269
#, no-c-format
msgid "If a validation error occurs, the validation runtime will use the default value, that we specified for the message attribute of the <classname>@CheckCase</classname> annotation to look up the error message in this file."
-msgstr ""
+msgstr "如果发现校验错误了的话, 你所使用的Bean Validation的实现会用我们定义在<classname>@CheckCase</classname>中message属性上的值作为键到这个文件中去查找对应的错误信息."
#. Tag: title
#: customconstraints.xml:276
#, no-c-format
msgid "Using the constraint"
-msgstr ""
+msgstr "应用约束条件"
#. Tag: para
#: customconstraints.xml:278
#, no-c-format
msgid "Now that our first custom constraint is completed, we can use it in the <classname>Car</classname> class from the <xref linkend=\"validator-gettingstarted\"/> chapter to specify that the <property>licensePlate</property> field shall only contain upper-case strings:"
-msgstr ""
+msgstr "现在我们已经有了一个自定义的约束条件了, 我们可以把它用在<xref linkend=\"validator-gettingstarted\"/>中的<classname>Car</classname>类上, 来校验此类的<property>licensePlate</property>属性的值是否全都是大写字母."
#. Tag: title
#: customconstraints.xml:285
#, no-c-format
msgid "Applying the <classname>CheckCase</classname> constraint"
-msgstr ""
+msgstr "应用<classname>CheckCase</classname>约束条件"
#. Tag: programlisting
#: customconstraints.xml:288
@@ -488,18 +599,47 @@
"\n"
"}"
msgstr ""
+"package com.mycompany;\n"
+"\n"
+"import javax.validation.constraints.Min;\n"
+"import javax.validation.constraints.NotNull;\n"
+"import javax.validation.constraints.Size;\n"
+"\n"
+"public class Car {\n"
+"\n"
+" @NotNull\n"
+" private String manufacturer;\n"
+"\n"
+" @NotNull\n"
+" @Size(min = 2, max = 14)\n"
+" @CheckCase(CaseMode.UPPER)\n"
+" private String licensePlate;\n"
+"\n"
+" @Min(2)\n"
+" private int seatCount;\n"
+" \n"
+" public Car(String manufacturer, String licencePlate, int seatCount) {\n"
+"\n"
+" this.manufacturer = manufacturer;\n"
+" this.licensePlate = licencePlate;\n"
+" this.seatCount = seatCount;\n"
+" }\n"
+"\n"
+" //getters and setters ...\n"
+"\n"
+"}"
#. Tag: para
#: customconstraints.xml:291
#, no-c-format
msgid "Finally let's demonstrate in a little test that the <classname>@CheckCase</classname> constraint is properly validated:"
-msgstr ""
+msgstr "最后,让我们用一个简单的测试来检测<classname>@CheckCase</classname>约束已经被正确的校验了:"
#. Tag: title
#: customconstraints.xml:296
#, no-c-format
msgid "Testcase demonstrating the <classname>CheckCase</classname> validation"
-msgstr ""
+msgstr "演示<classname>CheckCase</classname>的验证过程"
#. Tag: programlisting
#: customconstraints.xml:299
@@ -554,30 +694,78 @@
" }\n"
"}"
msgstr ""
+"package com.mycompany;\n"
+"\n"
+"import static org.junit.Assert.*;\n"
+"\n"
+"import java.util.Set;\n"
+"\n"
+"import javax.validation.ConstraintViolation;\n"
+"import javax.validation.Validation;\n"
+"import javax.validation.Validator;\n"
+"import javax.validation.ValidatorFactory;\n"
+"\n"
+"import org.junit.BeforeClass;\n"
+"import org.junit.Test;\n"
+"\n"
+"public class CarTest {\n"
+"\n"
+" private static Validator validator;\n"
+"\n"
+" @BeforeClass\n"
+" public static void setUp() {\n"
+" ValidatorFactory factory = Validation.buildDefaultValidatorFactory();\n"
+" validator = factory.getValidator();\n"
+" }\n"
+"\n"
+" @Test\n"
+" public void testLicensePlateNotUpperCase() {\n"
+"\n"
+" Car car = new Car(\"Morris\", \"dd-ab-123\", 4);\n"
+"\n"
+" Set<ConstraintViolation<Car>> constraintViolations =\n"
+" validator.validate(car);\n"
+" assertEquals(1, constraintViolations.size());\n"
+" assertEquals(\n"
+" \"Case mode must be UPPER.\", \n"
+" constraintViolations.iterator().next().getMessage());\n"
+" }\n"
+"\n"
+" @Test\n"
+" public void carIsValid() {\n"
+"\n"
+" Car car = new Car(\"Morris\", \"DD-AB-123\", 4);\n"
+"\n"
+" Set<ConstraintViolation<Car>> constraintViolations =\n"
+" validator.validate(car);\n"
+"\n"
+" assertEquals(0, constraintViolations.size());\n"
+" }\n"
+"}"
#. Tag: title
#: customconstraints.xml:305
#, no-c-format
msgid "Constraint composition"
-msgstr ""
+msgstr "约束条件组合"
#. Tag: para
#: customconstraints.xml:307
#, no-c-format
msgid "Looking at the <property>licensePlate</property> field of the <classname>Car</classname> class in <xref linkend=\"example-car-with-checkcase\"/>, we see three constraint annotations already. In complexer scenarios, where even more constraints could be applied to one element, this might become a bit confusing easily. Furthermore, if we had a <property>licensePlate</property> field in another class, we would have to copy all constraint declarations to the other class as well, violating the DRY principle."
-msgstr ""
+msgstr "在<xref linkend=\"example-car-with-checkcase\"/>中我们可以看到, 类<classname>Car</classname>的<property>licensePlate</property>属性上定义了三个约束条件. 在某些复杂的场景中, 可能还会有更多的约束条件被定义到同一个元素上面, 这可能会让代码看起来有些复杂, 另外, 如果在另外的类里面还有一个<property>licensePlate</property>属性, 我们可能还要把这些约束条件再拷贝到这个属性上, 但是这样做又违反了 DRY 原则."
#. Tag: para
#: customconstraints.xml:316
#, no-c-format
msgid "This problem can be tackled using compound constraints. In the following we create a new constraint annotation <classname>@ValidLicensePlate</classname>, that comprises the constraints <classname>@NotNull</classname>, <classname>@Size</classname> and <classname>@CheckCase</classname>:"
-msgstr ""
+msgstr "这个问题可以通过使用组合约束条件来解决. 接下来让我们来创建一个新的约束标注<classname>@ValidLicensePlate</classname>, 它组合了<classname>@NotNull</classname>, <classname>@Size</classname> 和 <classname>@CheckCase</classname>:"
#. Tag: title
#: customconstraints.xml:323
#, no-c-format
msgid "Creating a composing constraint <classname>ValidLicensePlate</classname>"
-msgstr ""
+msgstr "创建一个约束条件组合<classname>ValidLicensePlate</classname>"
#. Tag: programlisting
#: customconstraints.xml:326
@@ -614,24 +802,54 @@
"\n"
"}"
msgstr ""
+"package com.mycompany;\n"
+"\n"
+"import static java.lang.annotation.ElementType.*;\n"
+"import static java.lang.annotation.RetentionPolicy.*;\n"
+"\n"
+"import java.lang.annotation.Documented;\n"
+"import java.lang.annotation.Retention;\n"
+"import java.lang.annotation.Target;\n"
+"\n"
+"import javax.validation.Constraint;\n"
+"import javax.validation.Payload;\n"
+"import javax.validation.constraints.NotNull;\n"
+"import javax.validation.constraints.Size;\n"
+"\n"
+"@NotNull\n"
+"@Size(min = 2, max = 14)\n"
+"@CheckCase(CaseMode.UPPER)\n"
+"@Target( { METHOD, FIELD, ANNOTATION_TYPE })\n"
+"@Retention(RUNTIME)\n"
+"@Constraint(validatedBy = {})\n"
+"@Documented\n"
+"public @interface ValidLicensePlate {\n"
+"\n"
+" String message() default \"{com.mycompany.constraints.validlicenseplate}\";\n"
+"\n"
+" Class<?>[] groups() default {};\n"
+"\n"
+" Class<? extends Payload>[] payload() default {};\n"
+"\n"
+"}"
#. Tag: para
#: customconstraints.xml:329
#, no-c-format
msgid "To do so, we just have to annotate the constraint declaration with its comprising constraints (btw. that's exactly why we allowed annotation types as target for the <classname>@CheckCase</classname> annotation). As no additional validation is required for the <classname>@ValidLicensePlate</classname> annotation itself, we don't declare a validator within the <classname>@Constraint </classname>meta annotation."
-msgstr ""
+msgstr "我们只需要把要组合的约束标注在这个新的类型上加以声明 (注: 这正是我们为什么把annotation types作为了<classname>@CheckCase</classname>的一个target). 因为这个组合不需要额外的校验器, 所以不需要声明validator属性."
#. Tag: para
#: customconstraints.xml:337
#, no-c-format
msgid "Using the new compound constraint at the <property>licensePlate</property> field now is fully equivalent to the previous version, where we declared the three constraints directly at the field itself:"
-msgstr ""
+msgstr "现在, 在<property>licensePlate</property>属性上使用这个新定义的\"约束条件\" (其实是个组合) 和之前在其上声明那三个约束条件是一样的效果了."
#. Tag: title
#: customconstraints.xml:343
#, no-c-format
msgid "Application of composing constraint <classname>ValidLicensePlate</classname>"
-msgstr ""
+msgstr "使用<classname>ValidLicensePlate</classname>组合约束"
#. Tag: programlisting
#: customconstraints.xml:346
@@ -648,6 +866,16 @@
"\n"
"}"
msgstr ""
+"package com.mycompany;\n"
+"\n"
+"public class Car {\n"
+"\n"
+" @ValidLicensePlate\n"
+" private String licensePlate;\n"
+"\n"
+" //...\n"
+"\n"
+"}"
#. Tag: para
#: customconstraints.xml:349
@@ -659,7 +887,7 @@
#: customconstraints.xml:359
#, no-c-format
msgid "Usage of <classname>@ReportAsSingleViolation</classname>"
-msgstr ""
+msgstr "<classname>@ReportAsSingleViolation</classname>的用法"
#. Tag: programlisting
#: customconstraints.xml:361
@@ -677,4 +905,15 @@
"\n"
"}"
msgstr ""
+"//...\n"
+"@ReportAsSingleViolation\n"
+"public @interface ValidLicensePlate {\n"
+"\n"
+" String message() default \"{com.mycompany.constraints.validlicenseplate}\";\n"
+"\n"
+" Class<?>[] groups() default {};\n"
+"\n"
+" Class<? extends Payload>[] payload() default {};\n"
+"\n"
+"}"
Modified: validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/xmlconfiguration.po
===================================================================
--- validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/xmlconfiguration.po 2010-08-22 10:28:50 UTC (rev 20217)
+++ validator/trunk/hibernate-validator/src/main/docbook/zh-CN/modules/xmlconfiguration.po 2010-08-22 15:49:15 UTC (rev 20218)
@@ -6,8 +6,8 @@
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
"POT-Creation-Date: 2010-07-06 14:46+0000\n"
-"PO-Revision-Date: 2010-07-06 14:46+0000\n"
-"Last-Translator: Automatically generated\n"
+"PO-Revision-Date: 2010-08-22 23:44+0830\n"
+"Last-Translator: Strong Liu <stliu(a)hibernate.org>\n"
"Language-Team: none\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -17,190 +17,146 @@
#: xmlconfiguration.xml:25
#, no-c-format
msgid "XML configuration"
-msgstr ""
+msgstr "XML configuration"
#. Tag: filename
#: xmlconfiguration.xml:28
#, no-c-format
msgid "<filename>validation.xml</filename>"
-msgstr ""
+msgstr "<filename>validation.xml</filename>"
#. Tag: para
#: xmlconfiguration.xml:30
#, no-c-format
-msgid ""
-"The key to enable XML configuration for Hibernate Validator is the file "
-"<filename>validation.xml</filename>. If this file exists in the classpath "
-"its configuration will be applied when the <classname>ValidationFactory</"
-"classname> gets created. <xref linkend=\"image-validation-configuration\"/> "
-"shows a model view of the xsd <filename>valiation.xml</filename> has to "
-"adhere to."
-msgstr ""
+msgid "The key to enable XML configuration for Hibernate Validator is the file <filename>validation.xml</filename>. If this file exists in the classpath its configuration will be applied when the <classname>ValidationFactory</classname> gets created. <xref linkend=\"image-validation-configuration\"/> shows a model view of the xsd <filename>valiation.xml</filename> has to adhere to."
+msgstr "我们可以使用<filename>validation.xml</filename>来对Hibernate Validator进行配置. <classname>ValidationFactory</classname>在初始化的时候会在类路径下寻找此文件,如果找到的话,就会应用其中定义的配置信息. <xref linkend=\"image-validation-configuration\"/>显示了<filename>valiation.xml</filename>的xsd模型."
#. Tag: title
#: xmlconfiguration.xml:37
#, no-c-format
msgid "validation-configuration-1.0.xsd"
-msgstr ""
+msgstr "validation-configuration-1.0.xsd"
#. Tag: para
#: xmlconfiguration.xml:52
#, no-c-format
-msgid ""
-"shows the several configuration options of <filename>validation.xml</"
-"filename>."
-msgstr ""
+msgid "shows the several configuration options of <filename>validation.xml</filename>."
+msgstr "列出了<filename>validation.xml</filename>中的一些常用的配置项."
#. Tag: title
#: xmlconfiguration.xml:56
#, no-c-format
msgid "<title>validation.xml</title>"
-msgstr ""
+msgstr "<title>validation.xml</title>"
#. Tag: programlisting
#: xmlconfiguration.xml:58
#, no-c-format
msgid ""
-"<validation-config xmlns=\"http://jboss.org/xml/ns/javax/validation/"
-"configuration\"\n"
+"<validation-config xmlns=\"http://jboss.org/xml/ns/javax/validation/configuration\"\n"
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
-" xsi:schemaLocation=\"http://jboss.org/xml/ns/javax/validation/configuration"
-"\">\n"
-" <default-provider>org.hibernate.validator.HibernateValidator</"
-"default-provider>\n"
-" <message-interpolator>org.hibernate.validator.engine."
-"ResourceBundleMessageInterpolator</message-interpolator>\n"
-" <traversable-resolver>org.hibernate.validator.engine.resolver."
-"DefaultTraversableResolver</traversable-resolver>\n"
-" <constraint-validator-factory>org.hibernate.validator.engine."
-"ConstraintValidatorFactoryImpl</constraint-validator-factory>\n"
-" <constraint-mapping>/constraints-car.xml</constraint-"
-"mapping>\n"
+" xsi:schemaLocation=\"http://jboss.org/xml/ns/javax/validation/configuration\">\n"
+" <default-provider>org.hibernate.validator.HibernateValidator</default-provider>\n"
+" <message-interpolator>org.hibernate.validator.engine.ResourceBundleMessageInterpolator</message-interpolator>\n"
+" <traversable-resolver>org.hibernate.validator.engine.resolver.DefaultTraversableResolver</traversable-resolver>\n"
+" <constraint-validator-factory>org.hibernate.validator.engine.ConstraintValidatorFactoryImpl</constraint-validator-factory>\n"
+" <constraint-mapping>/constraints-car.xml</constraint-mapping>\n"
" <property name=\"prop1\">value1</property>\n"
" <property name=\"prop2\">value2</property>\n"
"</validation-config>"
msgstr ""
+"<validation-config xmlns=\"http://jboss.org/xml/ns/javax/validation/configuration\"\n"
+" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+" xsi:schemaLocation=\"http://jboss.org/xml/ns/javax/validation/configuration\">\n"
+" <default-provider>org.hibernate.validator.HibernateValidator</default-provider>\n"
+" <message-interpolator>org.hibernate.validator.engine.ResourceBundleMessageInterpolator</message-interpolator>\n"
+" <traversable-resolver>org.hibernate.validator.engine.resolver.DefaultTraversableResolver</traversable-resolver>\n"
+" <constraint-validator-factory>org.hibernate.validator.engine.ConstraintValidatorFactoryImpl</constraint-validator-factory>\n"
+" <constraint-mapping>/constraints-car.xml</constraint-mapping>\n"
+" <property name=\"prop1\">value1</property>\n"
+" <property name=\"prop2\">value2</property>\n"
+"</validation-config>"
#. Tag: para
#: xmlconfiguration.xml:62
#, no-c-format
-msgid ""
-"There can only be one <filename>validation.xml</filename> in the classpath. "
-"If more than one is found an exception is thrown."
-msgstr ""
+msgid "There can only be one <filename>validation.xml</filename> in the classpath. If more than one is found an exception is thrown."
+msgstr "类路径下面只能有一个<filename>validation.xml</filename>, 如果超过一个的话,会抛出异常."
#. Tag: para
#: xmlconfiguration.xml:66
#, no-c-format
-msgid ""
-"All settings shown in the <filename>validation.xml</filename> are optional "
-"and in the case of <xref linkend=\"example-validation-xml\"/> show the "
-"defaults used within Hibernate Validator. The node <property>default-"
-"provider</property> allows to choose the Bean Validation provider. This is "
-"useful if there is more than one provider in the classpath. "
-"<property>message-interpolator</property>, <property>traversable-resolver</"
-"property> and <property>constraint-validator-factory</property> allow to "
-"customize the <classname>javax.validation.MessageInterpolator</classname>, "
-"<classname>javax.validation.TraversableResolver</classname> resp. "
-"<classname>javax.validation.ConstraintValidatorFactory</classname>. The same "
-"configuration options are also available programmatically through the "
-"<classname>javax.validation.Configuration</classname>. In fact XML "
-"configuration will be overridden by values explicitly specified via the API. "
-"It is even possible to ignore the XML configuration completely via "
-"<methodname> Configuration.ignoreXmlConfiguration()</methodname>. See also "
-"<xref linkend=\"validator-bootstrapping\"/>."
-msgstr ""
+msgid "All settings shown in the <filename>validation.xml</filename> are optional and in the case of <xref linkend=\"example-validation-xml\"/> show the defaults used within Hibernate Validator. The node <property>default-provider</property> allows to choose the Bean Validation provider. This is useful if there is more than one provider in the classpath. <property>message-interpolator</property>, <property>traversable-resolver</property> and <property>constraint-validator-factory</property> allow to customize the <classname>javax.validation.MessageInterpolator</classname>, <classname>javax.validation.TraversableResolver</classname> resp. <classname>javax.validation.ConstraintValidatorFactory</classname>. The same configuration options are also available programmatically through the <classname>javax.validation.Configuration</classname>. In fact XML configuration will be overridden by values explicitly specified via the API. It is even possible to ignore the XML configuration!
completely via <methodname> Configuration.ignoreXmlConfiguration()</methodname>. See also <xref linkend=\"validator-bootstrapping\"/>."
+msgstr "<filename>validation.xml</filename>中所有的配置信息都是可选的, <xref linkend=\"example-validation-xml\"/>中就是列出了Hibernate Validator中的默认值. 如果类路径当中存在有多个Bean Validation的实现的话, 那么可以通过<property>default-provider</property>节点指定使用那个Bean Validation的实现. <property>message-interpolator</property>, <property>traversable-resolver</property> 和 <property>constraint-validator-factory</property>可以用来指定自定义的<classname>javax.validation.MessageInterpolator</classname>, <classname>javax.validation.TraversableResolver</classname>和<classname>javax.validation.ConstraintValidatorFactory</classname>. 同样的, 这些配置信息也可以通过编程的方式调用<classname>javax.validation.Configuration</classname>来实现. 另外, 你可以通过API的方式来重写xml中的配置信息, 也可以通过调用<methodname> Configuration.ignoreXmlConfiguration()</method!
name>来完全的忽略掉xml的配置信息. 请参考<xref linkend=\"validator-bootstrapping\"/>."
#. Tag: para
#: xmlconfiguration.xml:84
#, no-c-format
-msgid ""
-"Via the <property>constraint-mapping</property> you can list an arbitrary "
-"number of additional XML files containing the actual constraint "
-"configuration. See <xref linkend=\"section-mapping-constraints\"/>."
-msgstr ""
+msgid "Via the <property>constraint-mapping</property> you can list an arbitrary number of additional XML files containing the actual constraint configuration. See <xref linkend=\"section-mapping-constraints\"/>."
+msgstr "你可以增加若干个<property>constraint-mapping</property>节点,在每个里面列出一个额外的xml文件用来定义约束规则, 具体请参考<xref linkend=\"section-mapping-constraints\"/>."
#. Tag: para
#: xmlconfiguration.xml:88
#, no-c-format
-msgid ""
-"Last but not least, you can specify provider specific properties via the "
-"<property>property</property> nodes. Hibernate Validator does currently not "
-"make use of any custom properties."
-msgstr ""
+msgid "Last but not least, you can specify provider specific properties via the <property>property</property> nodes. Hibernate Validator does currently not make use of any custom properties."
+msgstr "最后, 你可以通过<property>property</property>来定义各个Bean Validation 实现专属的属性. Hibernate Validator当前并没有使用任何特定的属性."
#. Tag: title
#: xmlconfiguration.xml:94
#, no-c-format
msgid "Mapping constraints"
-msgstr ""
+msgstr "映射约束"
#. Tag: para
#: xmlconfiguration.xml:96
#, no-c-format
-msgid ""
-"Expressing constraints in XML is possible via files adhering to the xsd seen "
-"in <xref linkend=\"image-mapping-configuration\"/>. Note that these mapping "
-"files are only processed if listed via <property>constraint-mapping</"
-"property> in your <filename>validation.xml</filename>."
-msgstr ""
+msgid "Expressing constraints in XML is possible via files adhering to the xsd seen in <xref linkend=\"image-mapping-configuration\"/>. Note that these mapping files are only processed if listed via <property>constraint-mapping</property> in your <filename>validation.xml</filename>."
+msgstr "我们也可以通过xml来定义约束条件, 只需要这个xml符合<xref linkend=\"image-mapping-configuration\"/>中所定义的规范. 需要注意的是, 你必须把xml定义的约束列在<filename>validation.xml</filename>的<property>constraint-mapping</property>节点中才能得到处理."
#. Tag: title
#: xmlconfiguration.xml:103
#, no-c-format
msgid "validation-mapping-1.0.xsd"
-msgstr ""
+msgstr "validation-mapping-1.0.xsd"
#. Tag: para
#: xmlconfiguration.xml:118
#, no-c-format
-msgid ""
-"shows how our classes Car and RentalCar from <xref linkend=\"example-car\"/> "
-"resp. <xref linkend=\"example-rental-car\"/> could be mapped in XML."
-msgstr ""
+msgid "shows how our classes Car and RentalCar from <xref linkend=\"example-car\"/> resp. <xref linkend=\"example-rental-car\"/> could be mapped in XML."
+msgstr "显示了如何通过xml定义的方式来给<xref linkend=\"example-car\"/>中的类Car 以及<xref linkend=\"example-rental-car\"/> 中的RentalCar定义约束条件."
#. Tag: title
#: xmlconfiguration.xml:123
#, no-c-format
msgid "constraints-car.xml"
-msgstr ""
+msgstr "constraints-car.xml"
#. Tag: programlisting
#: xmlconfiguration.xml:125
#, no-c-format
msgid ""
-"<constraint-mappings xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance"
-"\"\n"
-" xsi:schemaLocation=\"http://jboss.org/xml/ns/javax/"
-"validation/mapping validation-mapping-1.0.xsd\"\n"
-" xmlns=\"http://jboss.org/xml/ns/javax/validation/mapping"
-"\">\n"
-" <default-package>org.hibernate.validator.quickstart</default-"
-"package>\n"
+"<constraint-mappings xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+" xsi:schemaLocation=\"http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd\"\n"
+" xmlns=\"http://jboss.org/xml/ns/javax/validation/mapping\">\n"
+" <default-package>org.hibernate.validator.quickstart</default-package>\n"
" <bean class=\"Car\" ignore-annotations=\"true\">\n"
" <field name=\"manufacturer\">\n"
-" <constraint annotation=\"javax.validation.constraints.NotNull"
-"\"/>\n"
+" <constraint annotation=\"javax.validation.constraints.NotNull\"/>\n"
" </field>\n"
" <field name=\"licensePlate\">\n"
-" <constraint annotation=\"javax.validation.constraints.NotNull"
-"\"/>\n"
+" <constraint annotation=\"javax.validation.constraints.NotNull\"/>\n"
" </field>\n"
" <field name=\"seatCount\">\n"
-" <constraint annotation=\"javax.validation.constraints.Min"
-"\">\n"
+" <constraint annotation=\"javax.validation.constraints.Min\">\n"
" <element name=\"value\">2</element>\n"
" </constraint>\n"
" </field>\n"
" <field name=\"driver\">\n"
" <valid/>\n"
" </field>\n"
-" <getter name=\"passedVehicleInspection\" ignore-annotations=\"true"
-"\">\n"
-" <constraint annotation=\"javax.validation.constraints."
-"AssertTrue\">\n"
-" <message>The car has to pass the vehicle inspection "
-"first</message>\n"
+" <getter name=\"passedVehicleInspection\" ignore-annotations=\"true\">\n"
+" <constraint annotation=\"javax.validation.constraints.AssertTrue\">\n"
+" <message>The car has to pass the vehicle inspection first</message>\n"
" <groups>\n"
" <value>CarChecks</value>\n"
" </groups>\n"
@@ -216,68 +172,72 @@
" </group-sequence>\n"
" </class>\n"
" </bean>\n"
-" <constraint-definition annotation=\"org.mycompany.CheckCase\" include-"
-"existing-validator=\"false\">\n"
+" <constraint-definition annotation=\"org.mycompany.CheckCase\" include-existing-validator=\"false\">\n"
" <validated-by include-existing-validators=\"false\">\n"
" <value>org.mycompany.CheckCaseValidator</value>\n"
" </validated-by>\n"
" </constraint-definition>\n"
"</constraint-mappings>"
msgstr ""
+"<constraint-mappings xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+" xsi:schemaLocation=\"http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.0.xsd\"\n"
+" xmlns=\"http://jboss.org/xml/ns/javax/validation/mapping\">\n"
+" <default-package>org.hibernate.validator.quickstart</default-package>\n"
+" <bean class=\"Car\" ignore-annotations=\"true\">\n"
+" <field name=\"manufacturer\">\n"
+" <constraint annotation=\"javax.validation.constraints.NotNull\"/>\n"
+" </field>\n"
+" <field name=\"licensePlate\">\n"
+" <constraint annotation=\"javax.validation.constraints.NotNull\"/>\n"
+" </field>\n"
+" <field name=\"seatCount\">\n"
+" <constraint annotation=\"javax.validation.constraints.Min\">\n"
+" <element name=\"value\">2</element>\n"
+" </constraint>\n"
+" </field>\n"
+" <field name=\"driver\">\n"
+" <valid/>\n"
+" </field>\n"
+" <getter name=\"passedVehicleInspection\" ignore-annotations=\"true\">\n"
+" <constraint annotation=\"javax.validation.constraints.AssertTrue\">\n"
+" <message>The car has to pass the vehicle inspection first</message>\n"
+" <groups>\n"
+" <value>CarChecks</value>\n"
+" </groups>\n"
+" <element name=\"max\">10</element>\n"
+" </constraint>\n"
+" </getter>\n"
+" </bean>\n"
+" <bean class=\"RentalCar\" ignore-annotations=\"true\">\n"
+" <class ignore-annotations=\"true\">\n"
+" <group-sequence>\n"
+" <value>RentalCar</value>\n"
+" <value>CarChecks</value>\n"
+" </group-sequence>\n"
+" </class>\n"
+" </bean>\n"
+" <constraint-definition annotation=\"org.mycompany.CheckCase\" include-existing-validator=\"false\">\n"
+" <validated-by include-existing-validators=\"false\">\n"
+" <value>org.mycompany.CheckCaseValidator</value>\n"
+" </validated-by>\n"
+" </constraint-definition>\n"
+"</constraint-mappings>"
#. Tag: para
#: xmlconfiguration.xml:128
#, no-c-format
-msgid ""
-"The XML configuration is closely mirroring the programmatic API. For this "
-"reason it should suffice to just add some comments. <property>default-"
-"package</property> is used for all fields where a classname is expected. If "
-"the specified class is not fully qualified the configured default package "
-"will be used. Every mapping file can then have several <property>bean</"
-"property> nodes, each describing the constraints on the entity with the "
-"specified class name.<warning> <para>A given entity can only be configured "
-"once across all configuration files. If the same class is configured more "
-"than once an exception is thrown.</para> </warning>Settings <property>ignore-"
-"annotations</property> to true means that constraint annotations placed on "
-"the configured bean are ignored. The default for this value is "
-"<constant>true</constant>. ignore-annotations is also available for the "
-"nodes <property>class</property>, <property>fields</property> and "
-"<property>getter</property>. If not explicitly specified on these levels the "
-"configured <property>bean</property> value applies. Otherwise do the nodes "
-"<property>class</property>, <property>fields</property> and "
-"<property>getter</property> determine on which level the constraints are "
-"placed (see <xref linkend=\"validator-usingvalidator-annotate\"/>). The "
-"<property>constraint</property> node is then used to add a constraint on the "
-"corresponding level. Each constraint definition must define the class via "
-"the annotation attribute. The constraint attributes required by the Bean "
-"Validation specification (<property>message</property>, <property>groups</"
-"property> and <property>payload</property>) have dedicated nodes. All other "
-"constraint specific attributes are configured using the the "
-"<property>element</property> node."
-msgstr ""
+msgid "The XML configuration is closely mirroring the programmatic API. For this reason it should suffice to just add some comments. <property>default-package</property> is used for all fields where a classname is expected. If the specified class is not fully qualified the configured default package will be used. Every mapping file can then have several <property>bean</property> nodes, each describing the constraints on the entity with the specified class name.<warning> <para>A given entity can only be configured once across all configuration files. If the same class is configured more than once an exception is thrown.</para> </warning>Settings <property>ignore-annotations</property> to true means that constraint annotations placed on the configured bean are ignored. The default for this value is <constant>true</constant>. ignore-annotations is also available for the nodes <property>class</property>, <property>fields</property> and <property>getter</property>. If not explic!
itly specified on these levels the configured <property>bean</property> value applies. Otherwise do the nodes <property>class</property>, <property>fields</property> and <property>getter</property> determine on which level the constraints are placed (see <xref linkend=\"validator-usingvalidator-annotate\"/>). The <property>constraint</property> node is then used to add a constraint on the corresponding level. Each constraint definition must define the class via the annotation attribute. The constraint attributes required by the Bean Validation specification (<property>message</property>, <property>groups</property> and <property>payload</property>) have dedicated nodes. All other constraint specific attributes are configured using the the <property>element</property> node."
+msgstr "这个xml的定义基本上和通过编程方式差不多, 所以只需要简单的解释. 其中<property>default-package</property>属性用来定义一个默认的包路径, 如果下面指定的class不是全限定名称的话,会自动加上这个默认的包路径. 每个xml文件都可以包含任意多个<property>bean</property>节点, 每个对应一个要添加约束条件的实体类.<warning> <para>每个实体类只能在所有的xml映射文件中被定义一次, 否则会抛出异常.</para> </warning> 通过添加<property>ignore-annotations</property> 属性并将其设置为<constant>true</constant>可以忽略在对应<property>bean</property>上添加的约束标注信息, 这个属性的默认值就是<constant>true</constant>. <property>ignore-annotations</property> 属性还可以定义在<property>class</property>, <property>fields</property> 和 <property>getter</property>属性上, 如果没有明确指定的话, 那么默认级别是<prop!
erty>bean</property> (可参考 <xref linkend=\"validator-usingvalidator-annotate\"/>). <property>constraint</property> 节点用于添加一个约束条件到其父节点对应的元素上, 并且它需要通过<property>annotation</property>属性来指定需要使用哪个约束条件. 对于每个约束条件中所需要的属性, 其中, 由Bean Validation 规范规定的属性(<property>message</property>, <property>groups</property> 和 <property>payload</property>) 可以通过同名的子节点来定义, 而每个约束条件中自定义的属性, 则需要使用<property>element</property>节点来定义."
#. Tag: para
#: xmlconfiguration.xml:156
#, no-c-format
-msgid ""
-"The class node also allows to reconfigure the default group sequence (see "
-"<xref linkend=\"section-default-group-class\"/>) via the <property>group-"
-"sequence</property> node."
-msgstr ""
+msgid "The class node also allows to reconfigure the default group sequence (see <xref linkend=\"section-default-group-class\"/>) via the <property>group-sequence</property> node."
+msgstr "<property>class</property>节点同样支持通过<property>group-sequence</property>节点来对一个类的默认校验组进行重定义(请参考 <xref linkend=\"section-default-group-class\"/>) ."
#. Tag: para
#: xmlconfiguration.xml:160
#, no-c-format
-msgid ""
-"Last but not least, the list of <classname>ConstraintValidator</classname>s "
-"associated to a given constraint can be altered via the <property>constraint-"
-"definition</property> node. The <property>annotation</property> attribute "
-"represents the constraint annotation being altered. The <property>validated-"
-"by</property> elements represent the (ordered) list of "
-"<classname>ConstraintValidator</classname> implementations associated to the "
-"constraint. If <property>include-existing-validator</property> is set to "
-"<constant>false</constant>, validators defined on the constraint annotation "
-"are ignored. If set to <constant>true</constant>, the list of "
-"ConstraintValidators described in XML are concatenated to the list of "
-"validators described on the annotation."
-msgstr ""
+msgid "Last but not least, the list of <classname>ConstraintValidator</classname>s associated to a given constraint can be altered via the <property>constraint-definition</property> node. The <property>annotation</property> attribute represents the constraint annotation being altered. The <property>validated-by</property> elements represent the (ordered) list of <classname>ConstraintValidator</classname> implementations associated to the constraint. If <property>include-existing-validator</property> is set to <constant>false</constant>, validators defined on the constraint annotation are ignored. If set to <constant>true</constant>, the list of ConstraintValidators described in XML are concatenated to the list of validators described on the annotation."
+msgstr "最后, 你还可以通过<property>constraint-definition</property>节点来对一个指定的约束条件上绑定的校验器(<classname>ConstraintValidator</classname>)进行修改. 此节点上的<property>annotation</property>对应要修改的约束条件, 而<property>validated-by</property>子节点中(按顺序)列出要关联到此约束条件上的校验器( <classname>ConstraintValidator</classname>的实现类), 而<property>include-existing-validator</property>属性如果是<constant>false</constant>的话,那么默认定义在此约束条件上的校验器将被忽略, 如果为<constant>true</constant>, 那么在xml中定义的校验器会被添加在约束条件上默认定义的校验器的后面."
+
13 years, 8 months
Hibernate SVN: r20217 - core/trunk/documentation/envers/src/main/docbook/en-US/content.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2010-08-22 06:28:50 -0400 (Sun, 22 Aug 2010)
New Revision: 20217
Modified:
core/trunk/documentation/envers/src/main/docbook/en-US/content/quickstart.xml
Log:
HHH-5197:
quickstart covers also direct Hibernate usage
Modified: core/trunk/documentation/envers/src/main/docbook/en-US/content/quickstart.xml
===================================================================
--- core/trunk/documentation/envers/src/main/docbook/en-US/content/quickstart.xml 2010-08-22 10:15:05 UTC (rev 20216)
+++ core/trunk/documentation/envers/src/main/docbook/en-US/content/quickstart.xml 2010-08-22 10:28:50 UTC (rev 20217)
@@ -32,8 +32,7 @@
<title>Quickstart</title>
<para>
- When configuring your Hibernate (<literal>persistence.xml</literal> if you are using JPA,
- <literal>hibernate.cfg.xml</literal> or other if you are using Hibernate directly), add the following event
+ If you're using JPA, when coniguring Hibernate (in <literal>persistence.xml</literal>), add the following event
listeners: (this will allow Envers to check if any audited entities were modified)
</para>
@@ -60,6 +59,24 @@
</persistence-unit></programlisting>
<para>
+ If you're using Hibernate directly, add the following to <literal>hibernate.cfg.xml</literal>:
+ </para>
+ <programlisting>
+ <hibernate-configuration>
+ <session-factory>
+
+ <listener class="org.hibernate.envers.event.AuditEventListener" type="post-insert"/>
+ <listener class="org.hibernate.envers.event.AuditEventListener" type="post-update"/>
+ <listener class="org.hibernate.envers.event.AuditEventListener" type="post-delete"/>
+ <listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-update"/>
+ <listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-remove"/>
+ <listener class="org.hibernate.envers.event.AuditEventListener" type="post-collection-recreate"/>
+
+
+ </session-factory>
+ </hibernate-configuration>
+ </programlisting>
+ <para>
The <literal>EJB3Post...EvenListener</literal>s are needed, so that ejb3 entity lifecycle callback
methods work (<literal>@PostPersist, @PostUpdate, @PostRemove</literal>.
</para>
@@ -155,3 +172,4 @@
</para>
</chapter>
+
13 years, 8 months
Hibernate SVN: r20216 - in core/trunk/envers/src/test: java/org/hibernate/envers/test/integration and 13 other directories.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2010-08-22 06:15:05 -0400 (Sun, 22 Aug 2010)
New Revision: 20216
Added:
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/
Removed:
core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/
Modified:
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/auditedEntity/Person.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/Car.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/Person.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/Car.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/Person.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/Car.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/Person.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/Car.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/Person.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/Car.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/Person.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
core/trunk/envers/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
core/trunk/envers/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
core/trunk/envers/src/test/resources/testng.xml
Log:
Cleanup: moving entityNames tests to integration
Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames (from rev 20214, core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames)
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/auditedEntity/Person.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/auditedEntity/Person.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.auditedEntity;
+package org.hibernate.envers.test.integration.entityNames.auditedEntity;
import org.hibernate.envers.Audited;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.auditedEntity;
+package org.hibernate.envers.test.integration.entityNames.auditedEntity;
import java.io.File;
import java.net.URISyntaxException;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/Car.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/Car.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.manyToManyAudited;
+package org.hibernate.envers.test.integration.entityNames.manyToManyAudited;
import java.util.List;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/Person.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/Person.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.manyToManyAudited;
+package org.hibernate.envers.test.integration.entityNames.manyToManyAudited;
import java.util.List;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.manyToManyAudited;
+package org.hibernate.envers.test.integration.entityNames.manyToManyAudited;
import java.io.File;
import java.net.URISyntaxException;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/Car.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/Car.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.oneToManyAudited;
+package org.hibernate.envers.test.integration.entityNames.oneToManyAudited;
import java.util.List;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/Person.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/Person.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.oneToManyAudited;
+package org.hibernate.envers.test.integration.entityNames.oneToManyAudited;
import org.hibernate.envers.Audited;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.oneToManyAudited;
+package org.hibernate.envers.test.integration.entityNames.oneToManyAudited;
import java.io.File;
import java.net.URISyntaxException;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/Car.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/Car.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+package org.hibernate.envers.test.integration.entityNames.oneToManyNotAudited;
import java.util.List;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/Person.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/Person.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+package org.hibernate.envers.test.integration.entityNames.oneToManyNotAudited;
/**
* @author Hern�n Chanfreau
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+package org.hibernate.envers.test.integration.entityNames.oneToManyNotAudited;
import java.io.File;
import java.net.URISyntaxException;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/Car.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/Car.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+package org.hibernate.envers.test.integration.entityNames.singleAssociatedAudited;
import org.hibernate.envers.Audited;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/Person.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/Person.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+package org.hibernate.envers.test.integration.entityNames.singleAssociatedAudited;
import org.hibernate.envers.Audited;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+package org.hibernate.envers.test.integration.entityNames.singleAssociatedAudited;
import java.io.File;
import java.net.URISyntaxException;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/Car.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/Car.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+package org.hibernate.envers.test.integration.entityNames.singleAssociatedNotAudited;
import org.hibernate.envers.Audited;
import org.hibernate.envers.RelationTargetAuditMode;
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/Person.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/Person.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+package org.hibernate.envers.test.integration.entityNames.singleAssociatedNotAudited;
/**
* @author Hern�n Chanfreau
Modified: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java 2010-08-22 10:15:05 UTC (rev 20216)
@@ -1,4 +1,4 @@
-package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+package org.hibernate.envers.test.integration.entityNames.singleAssociatedNotAudited;
import java.io.File;
import java.net.URISyntaxException;
Modified: core/trunk/envers/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
===================================================================
--- core/trunk/envers/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml 2010-08-21 16:09:49 UTC (rev 20215)
+++ core/trunk/envers/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml 2010-08-22 10:15:05 UTC (rev 20216)
@@ -2,7 +2,7 @@
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
- <class name="org.hibernate.envers.test.entityNames.auditedEntity.Person" entity-name="Personaje">
+ <class name="org.hibernate.envers.test.integration.entityNames.auditedEntity.Person" entity-name="Personaje">
<id name="id" column="ID_person" type="long" >
<generator class="native" />
Modified: core/trunk/envers/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
===================================================================
--- core/trunk/envers/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml 2010-08-21 16:09:49 UTC (rev 20215)
+++ core/trunk/envers/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml 2010-08-22 10:15:05 UTC (rev 20216)
@@ -2,7 +2,7 @@
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
- <class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Person"
+ <class name="org.hibernate.envers.test.integration.entityNames.manyToManyAudited.Person"
entity-name="Personaje">
<id name="id" column="ID_PERSON" type="long">
@@ -17,12 +17,12 @@
<bag name="cars" inverse="true" table="PERSON_CAR" >
<key column="ID_CAR" />
<many-to-many
- class="org.hibernate.envers.test.entityNames.manyToManyAudited.Car" column="ID_PERSON"/>
+ class="org.hibernate.envers.test.integration.entityNames.manyToManyAudited.Car" column="ID_PERSON"/>
</bag>
</class>
- <class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Car">
+ <class name="org.hibernate.envers.test.integration.entityNames.manyToManyAudited.Car">
<id name="id" column="ID_CAR" type="long">
<generator class="native" />
Modified: core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
===================================================================
--- core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml 2010-08-21 16:09:49 UTC (rev 20215)
+++ core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml 2010-08-22 10:15:05 UTC (rev 20216)
@@ -2,7 +2,7 @@
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
- <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Person" entity-name="Personaje">
+ <class name="org.hibernate.envers.test.integration.entityNames.oneToManyAudited.Person" entity-name="Personaje">
<id name="id" column="ID_PERSON" type="long" >
<generator class="native" />
@@ -15,7 +15,7 @@
</class>
- <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" >
+ <class name="org.hibernate.envers.test.integration.entityNames.oneToManyAudited.Car" >
<id name="id" column="ID_CAR" type="long">
<generator class="native" />
@@ -30,7 +30,7 @@
</class>
-<!-- <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Garage" >-->
+<!-- <class name="org.hibernate.envers.test.integration.entityNames.oneToManyAudited.Garage" >-->
<!---->
<!-- <id name="id" column="ID_GARAGE" type="long">-->
<!-- <generator class="native" />-->
@@ -40,7 +40,7 @@
<!---->
<!-- <bag name="cars" cascade="save-update">-->
<!-- <key column="ID_GARAGE" not-null="true" update="false" />-->
-<!-- <one-to-many class="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" />-->
+<!-- <one-to-many class="org.hibernate.envers.test.integration.entityNames.oneToManyAudited.Car" />-->
<!-- </bag>-->
<!-- -->
<!-- </class> -->
Modified: core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
===================================================================
--- core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml 2010-08-21 16:09:49 UTC (rev 20215)
+++ core/trunk/envers/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml 2010-08-22 10:15:05 UTC (rev 20216)
@@ -2,7 +2,7 @@
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
- <class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Person" entity-name="Personaje">
+ <class name="org.hibernate.envers.test.integration.entityNames.oneToManyNotAudited.Person" entity-name="Personaje">
<id name="id" column="ID_PERSON" type="long" >
<generator class="native" />
@@ -15,7 +15,7 @@
</class>
- <class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Car" >
+ <class name="org.hibernate.envers.test.integration.entityNames.oneToManyNotAudited.Car" >
<id name="id" column="ID_CAR" type="long">
<generator class="native" />
Modified: core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
===================================================================
--- core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml 2010-08-21 16:09:49 UTC (rev 20215)
+++ core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml 2010-08-22 10:15:05 UTC (rev 20216)
@@ -2,7 +2,7 @@
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
- <class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Person" entity-name="Personaje">
+ <class name="org.hibernate.envers.test.integration.entityNames.singleAssociatedAudited.Person" entity-name="Personaje">
<id name="id" column="ID_person" type="long" >
<generator class="native" />
@@ -15,7 +15,7 @@
</class>
- <class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Car" >
+ <class name="org.hibernate.envers.test.integration.entityNames.singleAssociatedAudited.Car" >
<id name="id" column="ID_BED" type="long">
<generator class="native" />
Modified: core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
===================================================================
--- core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml 2010-08-21 16:09:49 UTC (rev 20215)
+++ core/trunk/envers/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml 2010-08-22 10:15:05 UTC (rev 20216)
@@ -2,7 +2,7 @@
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
- <class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Person" entity-name="Personaje">
+ <class name="org.hibernate.envers.test.integration.entityNames.singleAssociatedNotAudited.Person" entity-name="Personaje">
<id name="id" column="ID_person" type="long" >
<generator class="native" />
@@ -15,7 +15,7 @@
</class>
- <class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Car" >
+ <class name="org.hibernate.envers.test.integration.entityNames.singleAssociatedNotAudited.Car" >
<id name="id" column="ID_BED" type="long">
<generator class="native" />
Modified: core/trunk/envers/src/test/resources/testng.xml
===================================================================
--- core/trunk/envers/src/test/resources/testng.xml 2010-08-21 16:09:49 UTC (rev 20215)
+++ core/trunk/envers/src/test/resources/testng.xml 2010-08-22 10:15:05 UTC (rev 20216)
@@ -69,12 +69,12 @@
<package name="org.hibernate.envers.test.integration.secondary.ids" />
<package name="org.hibernate.envers.test.integration.serialization" />
<package name="org.hibernate.envers.test.integration.superclass" />
- <package name="org.hibernate.envers.test.entityNames.auditedEntity" />
- <package name="org.hibernate.envers.test.entityNames.manyToManyAudited" />
- <package name="org.hibernate.envers.test.entityNames.oneToManyAudited" />
- <package name="org.hibernate.envers.test.entityNames.oneToManyNotAudited" />
- <package name="org.hibernate.envers.test.entityNames.singleAssociatedAudited" />
- <package name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited" />
+ <package name="org.hibernate.envers.test.integration.entityNames.auditedEntity" />
+ <package name="org.hibernate.envers.test.integration.entityNames.manyToManyAudited" />
+ <package name="org.hibernate.envers.test.integration.entityNames.oneToManyAudited" />
+ <package name="org.hibernate.envers.test.integration.entityNames.oneToManyNotAudited" />
+ <package name="org.hibernate.envers.test.integration.entityNames.singleAssociatedAudited" />
+ <package name="org.hibernate.envers.test.integration.entityNames.singleAssociatedNotAudited" />
'>
]>
13 years, 8 months
Hibernate SVN: r20215 - core/branches/Branch_3_5/envers/src/main/java/org/hibernate/envers/synchronization.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2010-08-21 12:09:49 -0400 (Sat, 21 Aug 2010)
New Revision: 20215
Modified:
core/branches/Branch_3_5/envers/src/main/java/org/hibernate/envers/synchronization/AuditProcess.java
Log:
HHH-5494: Using a temporary session if the original one is closed
Modified: core/branches/Branch_3_5/envers/src/main/java/org/hibernate/envers/synchronization/AuditProcess.java
===================================================================
--- core/branches/Branch_3_5/envers/src/main/java/org/hibernate/envers/synchronization/AuditProcess.java 2010-08-21 15:33:09 UTC (rev 20214)
+++ core/branches/Branch_3_5/envers/src/main/java/org/hibernate/envers/synchronization/AuditProcess.java 2010-08-21 16:09:49 UTC (rev 20215)
@@ -137,7 +137,7 @@
}
// see: http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4178431
- if (FlushMode.isManualFlushMode(session.getFlushMode())) {
+ if (FlushMode.isManualFlushMode(session.getFlushMode()) || session.isClosed()) {
Session temporarySession = null;
try {
temporarySession = session.getFactory().openTemporarySession();
13 years, 8 months
Hibernate SVN: r20214 - core/branches/envers-hibernate-3.3.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2010-08-21 11:33:09 -0400 (Sat, 21 Aug 2010)
New Revision: 20214
Modified:
core/branches/envers-hibernate-3.3/pom.xml
Log:
Next version
Modified: core/branches/envers-hibernate-3.3/pom.xml
===================================================================
--- core/branches/envers-hibernate-3.3/pom.xml 2010-08-21 15:17:26 UTC (rev 20213)
+++ core/branches/envers-hibernate-3.3/pom.xml 2010-08-21 15:33:09 UTC (rev 20214)
@@ -16,7 +16,7 @@
<name>Envers</name>
<description>Support for entity auditing</description>
- <version>1.2.3-hibernate-3.3</version>
+ <version>1.2.4-hibernate-3.3-SNAPSHOT</version>
<build>
<plugins>
13 years, 8 months
Hibernate SVN: r20213 - core/branches/envers-hibernate-3.3.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2010-08-21 11:17:26 -0400 (Sat, 21 Aug 2010)
New Revision: 20213
Modified:
core/branches/envers-hibernate-3.3/pom.xml
Log:
Preparing 1.2.3-hibernate-3.3 release
Modified: core/branches/envers-hibernate-3.3/pom.xml
===================================================================
--- core/branches/envers-hibernate-3.3/pom.xml 2010-08-21 15:15:15 UTC (rev 20212)
+++ core/branches/envers-hibernate-3.3/pom.xml 2010-08-21 15:17:26 UTC (rev 20213)
@@ -16,7 +16,7 @@
<name>Envers</name>
<description>Support for entity auditing</description>
- <version>1.2.3-hibernate-3.3-SNAPSHOT</version>
+ <version>1.2.3-hibernate-3.3</version>
<build>
<plugins>
13 years, 8 months
Hibernate SVN: r20212 - in core/branches/envers-hibernate-3.3: src/main/java/org/hibernate/envers and 40 other directories.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2010-08-21 11:15:15 -0400 (Sat, 21 Aug 2010)
New Revision: 20212
Added:
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java
core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml
Modified:
core/branches/envers-hibernate-3.3/pom.xml
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java
core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
Log:
Backported changes from 3.5 to 3.3 by Hernan Chanfreau (thanks!)
List of issues:
HHH-4716: NotAuditedException using the entity name concept of hibernate.
HHH-5288: Envers auditReader.find() returns wrong data for embedded components using fields with default values
HHH-3957: Audited Null Embeddable objects not returned as null
HHH-5191: CollectionMetadataGenerator fails to obtain mappedBy attribute when is defined on superclasses
HHH-4899: Type not supported: org.hibernate.type.TimestampType
HHH-4928: Non-Audited Entity with @ManyToOne in PK causes error in Envers 1.2.2
HHH-4731: Public API to know if an entity class is audited
HHH-4900: Wrong immutable type check in IdMetadataGenerator
HHH-4792: Validate fix for HHH-4791
HHH-4693: MapProxy - problems during marshalling/demarchalling
HHH-4793: Revert disabling of VersionsJoinTableRangeComponentNamingTest and fix underlying issue
HHH-4063: NPE reading metadata from an mapped interface
Modified: core/branches/envers-hibernate-3.3/pom.xml
===================================================================
--- core/branches/envers-hibernate-3.3/pom.xml 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/pom.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -7,7 +7,7 @@
<parent>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-parent</artifactId>
- <version>3.5.0-SNAPSHOT</version>
+ <version>3.5.3-Final</version>
</parent>
<groupId>org.jboss.envers</groupId>
@@ -125,6 +125,7 @@
<version>3.4.GA</version>
<scope>test</scope>
</dependency>
+
</dependencies>
<dependencyManagement>
@@ -132,7 +133,7 @@
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
- <version>3.3.1.GA</version>
+ <version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,7 +32,7 @@
/**
* @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
*/
public interface AuditReader {
/**
@@ -49,6 +49,23 @@
*/
<T> T find(Class<T> cls, Object primaryKey, Number revision) throws
IllegalArgumentException, NotAuditedException, IllegalStateException;
+
+ /**
+ * Find an entity by primary key at the given revision with the specified entityName.
+ * @param cls Class of the entity.
+ * @param entityName EntityName to find.
+ * @param primaryKey Primary key of the entity.
+ * @param revision Revision in which to get the entity.
+ * @return The found entity instance at the given revision (its properties may be partially filled
+ * if not all properties are audited) or null, if an entity with that id didn't exist at that
+ * revision.
+ * @throws IllegalArgumentException If cls or primaryKey is null or revision is less or equal to 0.
+ * @throws NotAuditedException When entities of the given class are not audited.
+ * @throws IllegalStateException If the associated entity manager is closed.
+ */
+ <T> T find(Class<T> cls, String entityName, Object primaryKey,
+ Number revision) throws IllegalArgumentException,
+ NotAuditedException, IllegalStateException;
/**
* Get a list of revision numbers, at which an entity was modified.
@@ -62,6 +79,21 @@
*/
List<Number> getRevisions(Class<?> cls, Object primaryKey)
throws IllegalArgumentException, NotAuditedException, IllegalStateException;
+
+ /**
+ * Get a list of revision numbers, at which an entity was modified, looking by entityName.
+ * @param cls Class of the entity.
+ * @param entityName EntityName to find.
+ * @param primaryKey Primary key of the entity.
+ * @return A list of revision numbers, at which the entity was modified, sorted in ascending order (so older
+ * revisions come first).
+ * @throws NotAuditedException When entities of the given class are not audited.
+ * @throws IllegalArgumentException If cls or primaryKey is null.
+ * @throws IllegalStateException If the associated entity manager is closed.
+ */
+ List<Number> getRevisions(Class<?> cls, String entityName, Object primaryKey)
+ throws IllegalArgumentException, NotAuditedException,
+ IllegalStateException;
/**
* Get the date, at which a revision was created.
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -53,6 +53,7 @@
* @author Adam Warski (adam at warski dot org)
* @author Sebastian Komander
* @author Tomasz Bech
+ * @author Hern�n Chanfreau
*/
public final class AuditMetadataGenerator {
private static final Logger log = LoggerFactory.getLogger(AuditMetadataGenerator.class);
@@ -285,53 +286,21 @@
}
}
- private void addSingleInheritancePersisterHack(Element class_mapping) {
- class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversSingleTableEntityPersister");
- }
-
- private void addJoinedInheritancePersisterHack(Element class_mapping) {
- class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversJoinedSubclassEntityPersister");
- }
-
- private void addTablePerClassInheritancePersisterHack(Element class_mapping) {
- class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversUnionSubclassEntityPersister");
- }
-
@SuppressWarnings({"unchecked"})
private Triple<Element, ExtendedPropertyMapper, String> generateMappingData(
PersistentClass pc, EntityXmlMappingData xmlMappingData, AuditTableData auditTableData,
IdMappingData idMapper) {
- boolean hasDiscriminator = pc.getDiscriminator() != null;
-
Element class_mapping = MetadataTools.createEntity(xmlMappingData.getMainXmlMapping(), auditTableData,
- hasDiscriminator ? pc.getDiscriminatorValue() : null);
+ pc.getDiscriminatorValue());
ExtendedPropertyMapper propertyMapper = new MultiPropertyMapper();
// Checking if there is a discriminator column
- if (hasDiscriminator) {
+ if (pc.getDiscriminator() != null) {
Element discriminator_element = class_mapping.addElement("discriminator");
MetadataTools.addColumns(discriminator_element, pc.getDiscriminator().getColumnIterator());
discriminator_element.addAttribute("type", pc.getDiscriminator().getType().getName());
}
- InheritanceType parentInheritance = InheritanceType.getForParent(pc);
- switch (parentInheritance) {
- case NONE:
- break;
-
- case SINGLE:
- addSingleInheritancePersisterHack(class_mapping);
- break;
-
- case JOINED:
- addJoinedInheritancePersisterHack(class_mapping);
- break;
-
- case TABLE_PER_CLASS:
- addTablePerClassInheritancePersisterHack(class_mapping);
- break;
- }
-
// Adding the id mapping
class_mapping.add((Element) idMapper.getXmlMapping().clone());
@@ -385,7 +354,7 @@
ExtendedPropertyMapper propertyMapper = null;
String parentEntityName = null;
- EntityConfiguration entityCfg = new EntityConfiguration(entityName, idMapper, propertyMapper,
+ EntityConfiguration entityCfg = new EntityConfiguration(entityName, pc.getClassName(), idMapper, propertyMapper,
parentEntityName);
notAuditedEntitiesConfigurations.put(entityName, entityCfg);
return;
@@ -405,7 +374,7 @@
// Generating a mapping for the id
IdMappingData idMapper = idMetadataGenerator.addId(pc, true);
- InheritanceType inheritanceType = InheritanceType.getForChild(pc);
+ InheritanceType inheritanceType = InheritanceType.get(pc);
// These properties will be read from the mapping data
final Element class_mapping;
@@ -427,8 +396,6 @@
case JOINED:
mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "joined-subclass");
- addJoinedInheritancePersisterHack(mappingData.getFirst());
-
// Adding the "key" element with all id columns...
Element keyMapping = mappingData.getFirst().addElement("key");
MetadataTools.addColumns(keyMapping, pc.getTable().getPrimaryKey().columnIterator());
@@ -439,9 +406,6 @@
case TABLE_PER_CLASS:
mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "union-subclass");
-
- addTablePerClassInheritancePersisterHack(mappingData.getFirst());
-
break;
default:
@@ -464,7 +428,7 @@
addJoins(pc, propertyMapper, auditingData, pc.getEntityName(), xmlMappingData, true);
// Storing the generated configuration
- EntityConfiguration entityCfg = new EntityConfiguration(auditEntityName, idMapper,
+ EntityConfiguration entityCfg = new EntityConfiguration(auditEntityName,pc.getClassName(), idMapper,
propertyMapper, parentEntityName);
entitiesConfigurations.put(pc.getEntityName(), entityCfg);
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -80,6 +80,7 @@
/**
* Generates metadata for a collection-valued property.
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public final class CollectionMetadataGenerator {
private static final Logger log = LoggerFactory.getLogger(CollectionMetadataGenerator.class);
@@ -108,7 +109,7 @@
* be created using this object.
* @param propertyAuditingData Property auditing (meta-)data. Among other things, holds the name of the
* property that references the collection in the referencing entity, the user data for middle (join)
- * table and the value of the <code>@MapKey</code> annotation, if there was one.
+ * table and the value of the <code>@MapKey</code> annotation, if there was one.
*/
public CollectionMetadataGenerator(AuditMetadataGenerator mainGenerator,
Collection propertyValue, CompositeMapperBuilder currentMapper,
@@ -208,7 +209,7 @@
// The mapper will only be used to map from entity to map, so no need to provide other details
// when constructing the PropertyData.
new PropertyData(auditMappedBy, null, null, null),
- referencedEntityName, false);
+ referencingEntityName, false);
// Checking if there's an index defined. If so, adding a mapper for it.
if (propertyAuditingData.getPositionMappedBy() != null) {
@@ -286,13 +287,13 @@
// Generating the XML mapping for the middle entity, only if the relation isn't inverse.
// If the relation is inverse, will be later checked by comparing middleEntityXml with null.
Element middleEntityXml;
- if (!propertyValue.isInverse()) {
+ if (!propertyValue.isInverse()) {
// Generating a unique middle entity name
auditMiddleEntityName = mainGenerator.getAuditEntityNameRegister().createUnique(auditMiddleEntityName);
// Registering the generated name
mainGenerator.getAuditEntityNameRegister().register(auditMiddleEntityName);
-
+
middleEntityXml = createMiddleEntityXml(auditMiddleTableName, auditMiddleEntityName, propertyValue.getWhere());
} else {
middleEntityXml = null;
@@ -533,7 +534,6 @@
return middleEntityXmlId;
}
- @SuppressWarnings({"unchecked"})
private String getMappedBy(Collection collectionValue) {
PersistentClass referencedClass = ((OneToMany) collectionValue.getElement()).getAssociatedClass();
@@ -543,8 +543,31 @@
return auditMappedBy;
}
+ // searching in referenced class
+ String mappedBy = this.searchMappedBy(referencedClass, collectionValue);
+
+ if(mappedBy == null) {
+ log.debug("Going to search the mapped by attribute for " + propertyName + " in superclasses of entity: " + referencedClass.getClassName());
+
+ PersistentClass tempClass = referencedClass;
+ while ((mappedBy == null) && (tempClass.getSuperclass() != null)) {
+ log.debug("Searching in superclass: " + tempClass.getSuperclass().getClassName());
+ mappedBy = this.searchMappedBy(tempClass.getSuperclass(), collectionValue);
+ tempClass = tempClass.getSuperclass();
+ }
+ }
+
+ if(mappedBy == null) {
+ throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
+ + referencedClass.getClassName() + "!");
+ }
+
+ return mappedBy;
+ }
+
+ @SuppressWarnings({"unchecked"})
+ private String searchMappedBy(PersistentClass referencedClass, Collection collectionValue) {
Iterator<Property> assocClassProps = referencedClass.getPropertyIterator();
-
while (assocClassProps.hasNext()) {
Property property = assocClassProps.next();
@@ -552,13 +575,10 @@
collectionValue.getKey().getColumnIterator())) {
return property.getName();
}
- }
-
- throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
- + referencingEntityName + "!");
+ }
+ return null;
}
- @SuppressWarnings({"unchecked"})
private String getMappedBy(Table collectionTable, PersistentClass referencedClass) {
// If there's an @AuditMappedBy specified, returning it directly.
String auditMappedBy = propertyAuditingData.getAuditMappedBy();
@@ -566,6 +586,31 @@
return auditMappedBy;
}
+ // searching in referenced class
+ String mappedBy = this.searchMappedBy(referencedClass, collectionTable);
+
+ // not found on referenced class, searching on superclasses
+ if(mappedBy == null) {
+ log.debug("Going to search the mapped by attribute for " + propertyName + " in superclases of entity: " + referencedClass.getClassName());
+
+ PersistentClass tempClass = referencedClass;
+ while ((mappedBy == null) && (tempClass.getSuperclass() != null)) {
+ log.debug("Searching in superclass: " + tempClass.getSuperclass().getClassName());
+ mappedBy = this.searchMappedBy(tempClass.getSuperclass(), collectionTable);
+ tempClass = tempClass.getSuperclass();
+ }
+ }
+
+ if(mappedBy == null) {
+ throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
+ + referencedClass.getClassName() + "!");
+ }
+
+ return mappedBy;
+ }
+
+ @SuppressWarnings({"unchecked"})
+ private String searchMappedBy(PersistentClass referencedClass, Table collectionTable) {
Iterator<Property> properties = referencedClass.getPropertyIterator();
while (properties.hasNext()) {
Property property = properties.next();
@@ -576,9 +621,8 @@
return property.getName();
}
}
- }
-
- throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
- + referencingEntityName + "!");
+ }
+ return null;
}
+
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -44,27 +44,16 @@
* @return The inheritance type of this class. NONE, if this class does not inherit from
* another persisten class.
*/
- public static InheritanceType getForChild(PersistentClass pc) {
+ public static InheritanceType get(PersistentClass pc) {
PersistentClass superclass = pc.getSuperclass();
if (superclass == null) {
return InheritanceType.NONE;
}
// We assume that every subclass is of the same type.
- return doGetForSubclass((Subclass) superclass.getSubclassIterator().next());
- }
+ Subclass subclass = (Subclass) superclass.getSubclassIterator().next();
- public static InheritanceType getForParent(PersistentClass pc) {
- if (!pc.getSubclassIterator().hasNext()) {
- return InheritanceType.NONE;
- }
-
- // We assume that every subclass is of the same type.
- return doGetForSubclass((Subclass) pc.getSubclassIterator().next());
- }
-
- private static InheritanceType doGetForSubclass(Subclass subclass) {
- if (subclass instanceof SingleTableSubclass) {
+ if (subclass instanceof SingleTableSubclass) {
return InheritanceType.SINGLE;
} else if (subclass instanceof JoinedSubclass) {
return InheritanceType.JOINED;
@@ -73,5 +62,5 @@
}
throw new MappingException("Unknown subclass class: " + subclass.getClass());
- }
+ }
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,18 +32,22 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntityConfiguration {
private String versionsEntityName;
- private IdMappingData idMappingData;
+ /** Holds the className for instantiation the configured entity */
+ private String entityClassName;
+ private IdMappingData idMappingData;
private ExtendedPropertyMapper propertyMapper;
// Maps from property name
private Map<String, RelationDescription> relations;
private String parentEntityName;
- public EntityConfiguration(String versionsEntityName, IdMappingData idMappingData,
+ public EntityConfiguration(String versionsEntityName, String entityClassName, IdMappingData idMappingData,
ExtendedPropertyMapper propertyMapper, String parentEntityName) {
this.versionsEntityName = versionsEntityName;
+ this.entityClassName = entityClassName;
this.idMappingData = idMappingData;
this.propertyMapper = propertyMapper;
this.parentEntityName = parentEntityName;
@@ -113,4 +117,11 @@
Iterable<RelationDescription> getRelationsIterator() {
return relations.values();
}
+
+ /**
+ * @return the className for the configured entity
+ */
+ public String getEntityClassName() {
+ return entityClassName;
+ }
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -36,6 +36,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntityInstantiator {
private final AuditConfiguration verCfg;
@@ -80,7 +81,13 @@
// If it is not in the cache, creating a new entity instance
Object ret;
try {
- Class<?> cls = ReflectionTools.loadClass(entityName);
+ EntityConfiguration entCfg = verCfg.getEntCfg().get(entityName);
+ if(entCfg == null) {
+ // a relation marked as RelationTargetAuditMode.NOT_AUDITED
+ entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(entityName);
+ }
+
+ Class<?> cls = ReflectionTools.loadClass(entCfg.getEntityClassName());
ret = ReflectHelper.getDefaultConstructor(cls).newInstance();
} catch (Exception e) {
throw new AuditException(e);
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -24,19 +24,19 @@
package org.hibernate.envers.entities.mapper;
import java.io.Serializable;
+import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.entities.PropertyData;
-import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.envers.tools.reflection.ReflectionTools;
-
-import org.hibernate.collection.PersistentCollection;
import org.hibernate.property.Setter;
import org.hibernate.util.ReflectHelper;
-import org.hibernate.engine.SessionImplementor;
/**
* @author Adam Warski (adam at warski dot org)
@@ -84,8 +84,12 @@
}
}
- // And we don't have to set anything on the object - the default value is null
- if (!allNullAndSingle) {
+ if (allNullAndSingle) {
+ // single property, but default value need not be null, so we'll set it to null anyway
+ setter.set(obj, null, null);
+
+ } else {
+ // set the component
try {
Object subObj = ReflectHelper.getDefaultConstructor(
Thread.currentThread().getContextClassLoader().loadClass(componentClassName)).newInstance();
@@ -97,7 +101,7 @@
}
}
- public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
+ public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
PersistentCollection newColl,
Serializable oldColl,
Serializable id) {
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -31,6 +31,7 @@
import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.entities.mapper.PersistentCollectionChangeData;
import org.hibernate.envers.entities.mapper.PropertyMapper;
+import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.entities.PropertyData;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.query.AuditEntity;
@@ -44,6 +45,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class OneToOneNotOwningMapper implements PropertyMapper {
private String owningReferencePropertyName;
@@ -66,12 +68,18 @@
return;
}
- Class<?> entityClass = ReflectionTools.loadClass(owningEntityName);
+ EntityConfiguration entCfg = verCfg.getEntCfg().get(owningEntityName);
+ if(entCfg == null) {
+ // a relation marked as RelationTargetAuditMode.NOT_AUDITED
+ entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(owningEntityName);
+ }
+ Class<?> entityClass = ReflectionTools.loadClass(entCfg.getEntityClassName());
+
Object value;
try {
- value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision)
+ value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, owningEntityName, revision)
.add(AuditEntity.relatedId(owningReferencePropertyName).eq(primaryKey)).getSingleResult();
} catch (NoResultException e) {
value = null;
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -33,6 +33,7 @@
import org.hibernate.envers.entities.mapper.PropertyMapper;
import org.hibernate.envers.entities.mapper.id.IdMapper;
import org.hibernate.envers.entities.mapper.relation.lazy.ToOneDelegateSessionImplementor;
+import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.entities.PropertyData;
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.envers.tools.Tools;
@@ -44,6 +45,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class ToOneIdMapper implements PropertyMapper {
private final IdMapper delegate;
@@ -68,7 +70,7 @@
delegate.mapToMapFromEntity(newData, nonInsertableFake ? oldObj : newObj);
//noinspection SimplifiableConditionalExpression
- return nonInsertableFake ? false : !Tools.entitiesEqual(session, newObj, oldObj);
+ return nonInsertableFake ? false : !Tools.entitiesEqual(session, referencedEntityName, newObj, oldObj);
}
public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey,
@@ -85,7 +87,13 @@
if (versionsReader.getFirstLevelCache().contains(referencedEntityName, revision, entityId)) {
value = versionsReader.getFirstLevelCache().get(referencedEntityName, revision, entityId);
} else {
- Class<?> entityClass = ReflectionTools.loadClass(referencedEntityName);
+ EntityConfiguration entCfg = verCfg.getEntCfg().get(referencedEntityName);
+ if(entCfg == null) {
+ // a relation marked as RelationTargetAuditMode.NOT_AUDITED
+ entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(referencedEntityName);
+ }
+
+ Class<?> entityClass = ReflectionTools.loadClass(entCfg.getEntityClassName());
value = versionsReader.getSessionImplementor().getFactory().getEntityPersister(referencedEntityName).
createProxy((Serializable)entityId, new ToOneDelegateSessionImplementor(versionsReader, entityClass, entityId, revision, verCfg));
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -27,7 +27,6 @@
import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.entities.EntitiesConfigurations;
-import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.HibernateException;
@@ -35,6 +34,7 @@
/**
* @author Adam Warski (adam at warski dot org)
* @author Tomasz Bech
+ * @author Hern�n Chanfreau
*/
public class ToOneDelegateSessionImplementor extends AbstractDelegateSessionImplementor {
private static final long serialVersionUID = 4770438372940785488L;
@@ -43,7 +43,7 @@
private final Class<?> entityClass;
private final Object entityId;
private final Number revision;
- private EntityConfiguration notVersionedEntityConfiguration;
+ private EntitiesConfigurations entCfg;
public ToOneDelegateSessionImplementor(AuditReaderImplementor versionsReader,
Class<?> entityClass, Object entityId, Number revision,
@@ -53,14 +53,15 @@
this.entityClass = entityClass;
this.entityId = entityId;
this.revision = revision;
- EntitiesConfigurations entCfg = verCfg.getEntCfg();
- notVersionedEntityConfiguration = entCfg.getNotVersionEntityConfiguration(entityClass.getName());
+ this.entCfg = verCfg.getEntCfg();
}
public Object doImmediateLoad(String entityName) throws HibernateException {
- if (notVersionedEntityConfiguration == null) {
- return versionsReader.find(entityClass, entityId, revision);
+ if(entCfg.getNotVersionEntityConfiguration(entityName) == null){
+ // audited relation, look up entity with envers
+ return versionsReader.find(entityClass, entityName, entityId, revision);
} else {
+ // notAudited relation, look up entity with hibernate
return delegate.immediateLoad(entityName, (Serializable) entityId);
}
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -61,6 +61,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class AuditEventListener implements PostInsertEventListener, PostUpdateEventListener,
PostDeleteEventListener, PreCollectionUpdateEventListener, PreCollectionRemoveEventListener,
@@ -91,7 +92,7 @@
Object oldValue = oldState == null ? null : oldState[i];
Object newValue = newState == null ? null : newState[i];
- if (!Tools.entitiesEqual(session, oldValue, newValue)) {
+ if (!Tools.entitiesEqual(session, relDesc.getToEntityName(), oldValue, newValue)) {
// We have to generate changes both in the old collection (size decreses) and new collection
// (size increases).
if (newValue != null) {
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,6 +32,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class AuditQueryCreator {
private final AuditConfiguration auditCfg;
@@ -56,6 +57,22 @@
checkPositive(revision, "Entity revision");
return new EntitiesAtRevisionQuery(auditCfg, auditReaderImplementor, c, revision);
}
+
+ /**
+ * Creates a query, which will return entities satisfying some conditions (specified later),
+ * at a given revision and a given entityName.
+ * @param c Class of the entities for which to query.
+ * @param entityName EntityName of the entities for which to query.
+ * @param revision Revision number at which to execute the query.
+ * @return A query for entities at a given revision, to which conditions can be added and which
+ * can then be executed. The result of the query will be a list of entities (beans), unless a
+ * projection is added.
+ */
+ public AuditQuery forEntitiesAtRevision(Class<?> c, String entityName, Number revision) {
+ checkNotNull(revision, "Entity revision");
+ checkPositive(revision, "Entity revision");
+ return new EntitiesAtRevisionQuery(auditCfg, auditReaderImplementor, c, entityName, revision);
+ }
/**
* Creates a query, which selects the revisions, at which the given entity was modified.
@@ -80,4 +97,30 @@
public AuditQuery forRevisionsOfEntity(Class<?> c, boolean selectEntitiesOnly, boolean selectDeletedEntities) {
return new RevisionsOfEntityQuery(auditCfg, auditReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities);
}
+
+ /**
+ * Creates a query, which selects the revisions, at which the given entity was modified and with a given entityName.
+ * Unless an explicit projection is set, the result will be a list of three-element arrays, containing:
+ * <ol>
+ * <li>the entity instance</li>
+ * <li>revision entity, corresponding to the revision at which the entity was modified. If no custom
+ * revision entity is used, this will be an instance of {@link org.hibernate.envers.DefaultRevisionEntity}</li>
+ * <li>type of the revision (an enum instance of class {@link org.hibernate.envers.RevisionType})</li>.
+ * </ol>
+ * Additional conditions that the results must satisfy may be specified.
+ * @param c Class of the entities for which to query.
+ * @param entityName EntityName of the entities for which to query.
+ * @param selectEntitiesOnly If true, instead of a list of three-element arrays, a list of entites will be
+ * returned as a result of executing this query.
+ * @param selectDeletedEntities If true, also revisions where entities were deleted will be returned. The additional
+ * entities will have revision type "delete", and contain no data (all fields null), except for the id field.
+ * @return A query for revisions at which instances of the given entity were modified, to which
+ * conditions can be added (for example - a specific id of an entity of class <code>c</code>), and which
+ * can then be executed. The results of the query will be sorted in ascending order by the revision number,
+ * unless an order or projection is added.
+ */
+ public AuditQuery forRevisionsOfEntity(Class<?> c, String entityName, boolean selectEntitiesOnly, boolean selectDeletedEntities) {
+ return new RevisionsOfEntityQuery(auditCfg, auditReaderImplementor, c, entityName, selectEntitiesOnly,selectDeletedEntities);
+ }
+
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -49,12 +49,14 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public abstract class AbstractAuditQuery implements AuditQuery {
protected EntityInstantiator entityInstantiator;
protected List<AuditCriterion> criterions;
protected String entityName;
+ protected String entityClassName;
protected String versionsEntityName;
protected QueryBuilder qb;
@@ -66,18 +68,25 @@
protected AbstractAuditQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader,
Class<?> cls) {
- this.verCfg = verCfg;
- this.versionsReader = versionsReader;
+ this(verCfg, versionsReader, cls, cls.getName());
+ }
- criterions = new ArrayList<AuditCriterion>();
- entityInstantiator = new EntityInstantiator(verCfg, versionsReader);
+ protected AbstractAuditQuery(AuditConfiguration verCfg,
+ AuditReaderImplementor versionsReader, Class<?> cls, String entityName) {
+ this.verCfg = verCfg;
+ this.versionsReader = versionsReader;
- entityName = cls.getName();
- versionsEntityName = verCfg.getAuditEntCfg().getAuditEntityName(entityName);
+ criterions = new ArrayList<AuditCriterion>();
+ entityInstantiator = new EntityInstantiator(verCfg, versionsReader);
- qb = new QueryBuilder(versionsEntityName, "e");
- }
+ entityClassName = cls.getName();
+ this.entityName = entityName;
+ versionsEntityName = verCfg.getAuditEntCfg().getAuditEntityName(
+ entityName);
+ qb = new QueryBuilder(versionsEntityName, "e");
+ }
+
protected List buildAndExecuteQuery() {
StringBuilder querySb = new StringBuilder();
Map<String, Object> queryParamValues = new HashMap<String, Object>();
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -35,6 +35,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntitiesAtRevisionQuery extends AbstractAuditQuery {
private final Number revision;
@@ -45,6 +46,12 @@
super(verCfg, versionsReader, cls);
this.revision = revision;
}
+
+ public EntitiesAtRevisionQuery(AuditConfiguration verCfg,
+ AuditReaderImplementor versionsReader, Class<?> cls, String entityName, Number revision) {
+ super(verCfg, versionsReader, cls, entityName);
+ this.revision = revision;
+ }
@SuppressWarnings({"unchecked"})
public List list() {
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -33,11 +33,11 @@
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.query.criteria.AuditCriterion;
import org.hibernate.envers.reader.AuditReaderImplementor;
-
import org.hibernate.proxy.HibernateProxy;
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class RevisionsOfEntityQuery extends AbstractAuditQuery {
private final boolean selectEntitiesOnly;
@@ -53,6 +53,15 @@
this.selectDeletedEntities = selectDeletedEntities;
}
+ public RevisionsOfEntityQuery(AuditConfiguration verCfg,
+ AuditReaderImplementor versionsReader, Class<?> cls, String entityName,
+ boolean selectEntitiesOnly, boolean selectDeletedEntities) {
+ super(verCfg, versionsReader, cls, entityName);
+
+ this.selectEntitiesOnly = selectEntitiesOnly;
+ this.selectDeletedEntities = selectDeletedEntities;
+ }
+
private Number getRevisionNumber(Map versionsEntity) {
AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg();
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -45,7 +45,7 @@
/**
* @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
*/
public class AuditReaderImpl implements AuditReaderImplementor {
private final AuditConfiguration verCfg;
@@ -80,17 +80,22 @@
return firstLevelCache;
}
- @SuppressWarnings({"unchecked"})
public <T> T find(Class<T> cls, Object primaryKey, Number revision) throws
IllegalArgumentException, NotAuditedException, IllegalStateException {
+
+ return this.find(cls, cls.getName(), primaryKey, revision);
+ }
+
+ @SuppressWarnings({"unchecked"})
+ public <T> T find(Class<T> cls, String entityName, Object primaryKey, Number revision) throws
+ IllegalArgumentException, NotAuditedException, IllegalStateException {
checkNotNull(cls, "Entity class");
+ checkNotNull(entityName, "Entity name");
checkNotNull(primaryKey, "Primary key");
checkNotNull(revision, "Entity revision");
checkPositive(revision, "Entity revision");
checkSession();
- String entityName = cls.getName();
-
if (!verCfg.getEntCfg().isVersioned(entityName)) {
throw new NotAuditedException(entityName, entityName + " is not versioned!");
}
@@ -102,7 +107,7 @@
Object result;
try {
// The result is put into the cache by the entity instantiator called from the query
- result = createQuery().forEntitiesAtRevision(cls, revision)
+ result = createQuery().forEntitiesAtRevision(cls, entityName, revision)
.add(AuditEntity.id().eq(primaryKey)).getSingleResult();
} catch (NoResultException e) {
result = null;
@@ -111,23 +116,28 @@
}
return (T) result;
+ }
+
+ public List<Number> getRevisions(Class<?> cls, Object primaryKey)
+ throws IllegalArgumentException, NotAuditedException, IllegalStateException {
+
+ return this.getRevisions(cls, cls.getName(), primaryKey);
}
@SuppressWarnings({"unchecked"})
- public List<Number> getRevisions(Class<?> cls, Object primaryKey)
+ public List<Number> getRevisions(Class<?> cls, String entityName, Object primaryKey)
throws IllegalArgumentException, NotAuditedException, IllegalStateException {
// todo: if a class is not versioned from the beginning, there's a missing ADD rev - what then?
checkNotNull(cls, "Entity class");
+ checkNotNull(entityName, "Entity name");
checkNotNull(primaryKey, "Primary key");
checkSession();
- String entityName = cls.getName();
-
if (!verCfg.getEntCfg().isVersioned(entityName)) {
throw new NotAuditedException(entityName, entityName + " is not versioned!");
}
- return createQuery().forRevisionsOfEntity(cls, false, true)
+ return createQuery().forRevisionsOfEntity(cls, entityName, false, true)
.addProjection(AuditEntity.revisionNumber())
.add(AuditEntity.id().eq(primaryKey))
.getResultList();
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,6 +32,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class Tools {
public static <K,V> Map<K,V> newHashMap() {
@@ -46,14 +47,14 @@
return new LinkedHashMap<K,V>();
}
- public static boolean entitiesEqual(SessionImplementor session, Object obj1, Object obj2) {
- Object id1 = getIdentifier(session, obj1);
- Object id2 = getIdentifier(session, obj2);
+ public static boolean entitiesEqual(SessionImplementor session, String entityName, Object obj1, Object obj2) {
+ Object id1 = getIdentifier(session, entityName, obj1);
+ Object id2 = getIdentifier(session, entityName, obj2);
return objectsEqual(id1, id2);
- }
+ }
- public static Object getIdentifier(SessionImplementor session, Object obj) {
+ public static Object getIdentifier(SessionImplementor session, String entityName, Object obj) {
if (obj == null) {
return null;
}
@@ -64,7 +65,7 @@
}
- return session.getEntityPersister(null, obj).getIdentifier(obj, session.getEntityMode());
+ return session.getEntityPersister(entityName, obj).getIdentifier(obj, session.getEntityMode());
}
public static Object getTargetFromProxy(SessionFactoryImplementor sessionFactoryImplementor, HibernateProxy proxy) {
@@ -73,12 +74,18 @@
}
SessionImplementor sessionImplementor = proxy.getHibernateLazyInitializer().getSession();
- Session tempSession = sessionImplementor==null ? sessionFactoryImplementor.openTemporarySession() : sessionImplementor.getFactory().openTemporarySession();
+ Session tempSession = sessionImplementor==null
+ ? sessionFactoryImplementor.openTemporarySession()
+ : sessionImplementor.getFactory().openTemporarySession();
try {
- proxy.getHibernateLazyInitializer().setSession((SessionImplementor) tempSession);
- proxy.getHibernateLazyInitializer().initialize();
- return proxy.getHibernateLazyInitializer().getImplementation();
- } finally {
+ Object target = tempSession.get(
+ proxy.getHibernateLazyInitializer().getEntityName(),
+ proxy.getHibernateLazyInitializer().getIdentifier()
+ );
+ proxy.getHibernateLazyInitializer().setImplementation( target );
+ return target;
+ }
+ finally {
tempSession.close();
}
}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -89,7 +89,12 @@
if (audited) {
initListeners();
}
+
cfg.configure("hibernate.test.cfg.xml");
+
+ // Separate database for each test class
+ cfg.setProperty("hibernate.connection.url", "jdbc:h2:mem:" + this.getClass().getName());
+
configure(cfg);
emf = cfg.buildEntityManagerFactory();
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,79 @@
+package org.hibernate.envers.test;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.envers.AuditReader;
+import org.hibernate.envers.AuditReaderFactory;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
+/**
+ * Base class for testing envers with Session.
+ *
+ * @author Hern�n Chanfreau
+ *
+ */
+public abstract class AbstractSessionTest {
+
+ protected Configuration config;
+ private SessionFactory sessionFactory;
+ private Session session ;
+ private AuditReader auditReader;
+
+
+ @BeforeClass
+ public void init() {
+ config = new AnnotationConfiguration();
+ try {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("hibernate.test.session-cfg.xml");
+ config.configure(new File(url.toURI()));
+ this.initMappings();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ sessionFactory = config.buildSessionFactory();
+ }
+
+ protected abstract void initMappings() throws MappingException, URISyntaxException ;
+
+
+
+ private SessionFactory getSessionFactory(){
+ return sessionFactory;
+ }
+
+
+ @BeforeMethod
+ public void newSessionFactory() {
+ session = getSessionFactory().openSession();
+ auditReader = AuditReaderFactory.get(session);
+ }
+
+ @AfterClass
+ public void closeSessionFactory() {
+ sessionFactory.close();
+ }
+
+
+ protected Session getSession() {
+ return session;
+ }
+
+
+
+ protected AuditReader getAuditReader() {
+ return auditReader;
+ }
+
+}
+
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,68 @@
+package org.hibernate.envers.test.entities.components;
+
+import javax.persistence.Embedded;
+
+/**
+ *
+ * @author Erik-Berndt Scheper
+ *
+ */
+public class DefaultValueComponent1 {
+
+ private String str1;
+
+ @Embedded
+ private DefaultValueComponent2 comp2 = new DefaultValueComponent2();
+
+ public static final DefaultValueComponent1 of(String str1,
+ DefaultValueComponent2 comp2) {
+ DefaultValueComponent1 instance = new DefaultValueComponent1();
+ instance.setStr1(str1);
+ instance.setComp2(comp2);
+ return instance;
+ }
+
+ public String getStr1() {
+ return str1;
+ }
+
+ public void setStr1(String str1) {
+ this.str1 = str1;
+ }
+
+ public DefaultValueComponent2 getComp2() {
+ return comp2;
+ }
+
+ public void setComp2(DefaultValueComponent2 comp2) {
+ this.comp2 = comp2;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (!(o instanceof DefaultValueComponent1))
+ return false;
+
+ DefaultValueComponent1 that = (DefaultValueComponent1) o;
+
+ if (str1 != null ? !str1.equals(that.str1) : that.str1 != null)
+ return false;
+ if (comp2 != null ? !comp2.equals(that.comp2) : that.comp2 != null)
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (str1 != null ? str1.hashCode() : 0);
+ result = 31 * result + (comp2 != null ? comp2.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "Comp1(str1 = " + str1 + ", comp2 = " + comp2 + ")";
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,64 @@
+package org.hibernate.envers.test.entities.components;
+
+/**
+ *
+ * @author Erik-Berndt Scheper
+ *
+ */
+public class DefaultValueComponent2 {
+
+ private String str1 = "defaultValue";
+
+ private String str2;
+
+ public static final DefaultValueComponent2 of(String str1, String str2) {
+ DefaultValueComponent2 instance = new DefaultValueComponent2();
+ instance.setStr1(str1);
+ instance.setStr2(str2);
+ return instance;
+ }
+
+ public String getStr2() {
+ return str2;
+ }
+
+ public void setStr2(String str2) {
+ this.str2 = str2;
+ }
+
+ public String getStr1() {
+ return str1;
+ }
+
+ public void setStr1(String str1) {
+ this.str1 = str1;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (!(o instanceof DefaultValueComponent2))
+ return false;
+
+ DefaultValueComponent2 that = (DefaultValueComponent2) o;
+
+ if (str1 != null ? !str1.equals(that.str1) : that.str1 != null)
+ return false;
+ if (str2 != null ? !str2.equals(that.str2) : that.str2 != null)
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (str1 != null ? str1.hashCode() : 0);
+ result = 31 * result + (str2 != null ? str2.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "Comp2(str1 = " + str1 + ", str2 = " + str2 + ")";
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,111 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities.components;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Erik-Berndt Scheper
+ */
+@Entity
+@Audited
+public class DefaultValueComponentTestEntity {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @Embedded
+ @Audited
+ @AttributeOverrides( { @AttributeOverride(name = "comp2.str1", column = @Column(name = "COMP2_STR1")) })
+ private DefaultValueComponent1 comp1 = null;
+
+ public DefaultValueComponentTestEntity() {
+ }
+
+ public static DefaultValueComponentTestEntity of(
+ DefaultValueComponent1 comp1) {
+ DefaultValueComponentTestEntity instance = new DefaultValueComponentTestEntity();
+ instance.setComp1(comp1);
+ return instance;
+ }
+
+ public static DefaultValueComponentTestEntity of(Integer id,
+ DefaultValueComponent1 comp1) {
+ DefaultValueComponentTestEntity instance = new DefaultValueComponentTestEntity();
+ instance.setId(id);
+ instance.setComp1(comp1);
+ return instance;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public DefaultValueComponent1 getComp1() {
+ return comp1;
+ }
+
+ public void setComp1(DefaultValueComponent1 comp1) {
+ this.comp1 = comp1;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (!(o instanceof DefaultValueComponentTestEntity))
+ return false;
+
+ DefaultValueComponentTestEntity that = (DefaultValueComponentTestEntity) o;
+
+ if (comp1 != null ? !comp1.equals(that.comp1) : that.comp1 != null)
+ return false;
+ if (id != null ? !id.equals(that.id) : that.id != null)
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (id != null ? id.hashCode() : 0);
+ result = 31 * result + (comp1 != null ? comp1.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "CTE(id = " + id + ", comp1 = " + comp1 + ")";
+ }
+}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -37,7 +37,7 @@
public class EmbIdWithCustomType implements Serializable {
private Integer x;
- @Type(type = "customEnum")
+ @Type(type = "org.hibernate.envers.test.entities.ids.CustomEnumUserType")
private CustomEnum customEnum;
public EmbIdWithCustomType() {
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.auditedEntity;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,99 @@
+package org.hibernate.envers.test.entityNames.auditedEntity;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityWhtiEntityNameTest extends AbstractSessionTest{
+
+ private long id_pers1;
+ private long id_pers2;
+ private long id_pers3;
+
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/auditedEntity/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 30);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist("Personaje",pers1);
+ id_pers1 = pers1.getId();
+ getSession().getTransaction().commit();
+
+ //REV 2
+ getSession().getTransaction().begin();
+ pers1 = (Person)getSession().get("Personaje", id_pers1);
+ pers1.setAge(29);
+ getSession().persist("Personaje",pers1);
+ getSession().persist("Personaje",pers2);
+ id_pers2 = pers2.getId();
+ getSession().getTransaction().commit();
+
+ //REV
+ getSession().getTransaction().begin();
+ pers1 = (Person)getSession().get("Personaje", id_pers1);
+ pers1.setName("Hernan David");
+ pers2 = (Person)getSession().get("Personaje", id_pers2);
+ pers2.setAge(30);
+ getSession().persist("Personaje",pers1);
+ getSession().persist("Personaje",pers2);
+ getSession().persist("Personaje",pers3);
+ id_pers3 = pers3.getId();
+ getSession().getTransaction().commit();
+
+ }
+
+
+ @Test
+ public void testRetrieveRevisionsWithEntityName() {
+ List<Number> pers1Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers1);
+ List<Number> pers2Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers2);
+ List<Number> pers3Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers3);
+
+ assert(pers1Revs.size() == 3);
+ assert(pers2Revs.size() == 2);
+ assert(pers3Revs.size() == 1);
+ }
+
+ @Test
+ public void testRetrieveAuditedEntityWithEntityName() {
+ Person Person1 = getAuditReader().find(Person.class, "Personaje", id_pers1, 1);
+ Person Person2 = getAuditReader().find(Person.class, "Personaje", id_pers1, 2);
+ Person Person3 = getAuditReader().find(Person.class, "Personaje", id_pers1, 3);
+
+ System.out.println("Revision 1:");
+ System.out.println(" > Name: " + Person1.getName());
+ System.out.println(" > Age: " + Person1.getAge());
+ System.out.println("Revision 2:");
+ System.out.println(" > Name: " + Person2.getName());
+ System.out.println(" > Age: " + Person2.getAge());
+ System.out.println("Revision 3:");
+ System.out.println(" > Name: " + Person3.getName());
+ System.out.println(" > Age: " + Person3.getAge());
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@Audited
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private List<Person> owners;
+
+
+ public Car() { }
+
+ public Car(int number, List<Person> owners) {
+ this.number = number;
+ this.owners = owners;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public List<Person> getOwners() {
+ return owners;
+ }
+
+ public void setOwners(List<Person> owners) {
+ this.owners = owners;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,63 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ private List<Car> cars;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public List<Car> getCars() {
+ return cars;
+ }
+
+ public void setCars(List<Car> cars) {
+ this.cars = cars;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,99 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityWithAuditedManyToManyTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/manyToManyAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 32);
+ Person pers4 = new Person("Camomo", 15);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ List<Person > owners = new ArrayList<Person>();
+ owners.add(pers1);
+ owners.add(pers2);
+ owners.add(pers3);
+ Car car1 = new Car(5, owners);
+
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_pers1 = pers1.getId();
+ id_car1 = car1.getId();
+
+ owners = new ArrayList<Person>();
+ owners.add(pers2);
+ owners.add(pers3);
+ owners.add(pers4);
+ Car car2 = new Car(27, owners);
+ //REV 2
+ getSession().getTransaction().begin();
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ person1.setName("Hernan David");
+ person1.setAge(40);
+ getSession().persist(car1);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+
+ }
+
+ @Test
+ public void testObtainManyYoManyWithEntityName() {
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ System.out.println(" > Car: " + car1.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car1.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ System.out.println(" > Cars owned:");
+ for (Car ownedCar : owner.getCars()) {
+ System.out.println(" o Car: " + ownedCar.getNumber());
+ }
+ }
+ System.out.println(" > Car: " + car2.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car2.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ System.out.println(" > Cars owned:");
+ for (Car ownedCar : owner.getCars()) {
+ System.out.println(" o Car: " + ownedCar.getNumber());
+ }
+ }
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@Audited
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private List<Person> owners;
+
+
+ public Car() { }
+
+ public Car(int number, List<Person> owners) {
+ this.number = number;
+ this.owners = owners;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public List<Person> getOwners() {
+ return owners;
+ }
+
+ public void setOwners(List<Person> owners) {
+ this.owners = owners;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,89 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityWithAuditedCollectionTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/oneToManyAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 32);
+ Person pers4 = new Person("Camomo", 15);
+
+ List<Person > owners = new ArrayList<Person>();
+ owners.add(pers1);
+ owners.add(pers2);
+ Car car1 = new Car(5, owners);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_pers1 = pers1.getId();
+ id_car1 = car1.getId();
+
+ owners = new ArrayList<Person>();
+ owners.add(pers2);
+ owners.add(pers4);
+ Car car2 = new Car(27, owners);
+ //REV 2
+ getSession().getTransaction().begin();
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ person1.setName("Hernan David");
+ person1.setAge(40);
+ getSession().persist(car1);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+
+ }
+
+ @Test
+ public void testObtainCollectionWithEntityName() {
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ System.out.println(" > Car: " + car1.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car1.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ System.out.println(" > Car: " + car2.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car2.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,58 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.RelationTargetAuditMode;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private List<Person> owners;
+
+
+ public Car() { }
+
+ public Car(int number, List<Person> owners) {
+ this.number = number;
+ this.owners = owners;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ @Audited(targetAuditMode=RelationTargetAuditMode.NOT_AUDITED)
+ public List<Person> getOwners() {
+ return owners;
+ }
+
+ public void setOwners(List<Person> owners) {
+ this.owners = owners;
+ }
+
+ @Audited
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,84 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class ReadEntityWithAuditedCollectionTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 32);
+ Person pers4 = new Person("Camomo", 15);
+
+ List<Person > owners = new ArrayList<Person>();
+ owners.add(pers1);
+ owners.add(pers2);
+ Car car1 = new Car(5, owners);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_pers1 = pers1.getId();
+ id_car1 = car1.getId();
+
+ owners = new ArrayList<Person>();
+ owners.add(pers2);
+ owners.add(pers4);
+ Car car2 = new Car(27, owners);
+ //REV 2
+ getSession().getTransaction().begin();
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ person1.setName("Hernan David");
+ person1.setAge(40);
+ getSession().persist(car1);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+
+ }
+
+ @Test
+ public void testObtainCollectionWithEntityNameAndNotAuditedMode() {
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ System.out.println(" > Car: " + car1.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car1.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ System.out.println(" > Car: " + car2.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car2.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,54 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@Audited
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private Person owner;
+
+
+ public Car() { }
+
+ public Car(int number, Person owner) {
+ this.number = number;
+ this.owner = owner;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Person getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Person owner) {
+ this.owner = owner;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,77 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityAssociatedAuditedTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+ private long id_pers2;
+
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 15);
+ Person pers2 = new Person("Leandro", 19);
+
+ Car car1 = new Car(1, pers1);
+ Car car2 = new Car(2, pers2);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist("Personaje",pers1);
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_car1 = car1.getId();
+ id_pers1 = pers1.getId();
+
+ //REV 2
+ getSession().getTransaction().begin();
+ pers1.setAge(50);
+ getSession().persist("Personaje", pers1);
+ getSession().persist("Personaje", pers2);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+ id_pers2 = pers2.getId();
+
+ }
+
+ @Test
+ public void testGetAssociationWithEntityName() {
+
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ Car car1 = getAuditReader().find(Car.class, id_car1, 1);
+ Person person1_1 = car1.getOwner();
+ assert(person1.getAge() != person1_1.getAge());
+
+ Person person2 = (Person)getSession().get("Personaje", id_pers2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+ Person person2_1 = car2.getOwner();
+ assert(person2.getAge() == person2_1.getAge());
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.RelationTargetAuditMode;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private Person owner;
+
+
+ public Car() { }
+
+ public Car(int number, Person owner) {
+ this.number = number;
+ this.owner = owner;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ @Audited(targetAuditMode=RelationTargetAuditMode.NOT_AUDITED)
+ public Person getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Person owner) {
+ this.owner = owner;
+ }
+
+ @Audited
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,80 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityAssociatedNotAuditedTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+ private long id_pers2;
+
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 15);
+ Person pers2 = new Person("Leandro", 19);
+
+ Car car1 = new Car(1, pers1);
+ Car car2 = new Car(2, pers2);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist("Personaje",pers1);
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_car1 = car1.getId();
+ id_pers1 = pers1.getId();
+
+ //REV 2
+ getSession().getTransaction().begin();
+ pers1.setAge(50);
+ getSession().persist("Personaje", pers1);
+ getSession().persist("Personaje", pers2);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+ id_pers2 = pers2.getId();
+
+ }
+
+ @Test
+ public void testGetAssociationWithEntityNameAndNotAuditedMode() {
+ // persons from "actual" model
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ Person person2 = (Person)getSession().get("Personaje", id_pers2);
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 1);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ // persons from "historic" model
+ Person person1_1 = car1.getOwner();
+ Person person2_1 = car2.getOwner();
+
+ assert(person1.getAge() == person1_1.getAge());
+ assert(person2.getAge() == person2_1.getAge());
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,383 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.components;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.components.DefaultValueComponent1;
+import org.hibernate.envers.test.entities.components.DefaultValueComponent2;
+import org.hibernate.envers.test.entities.components.DefaultValueComponentTestEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for components with default values.
+ *
+ * @see <a
+ * href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-5288">
+ * Hibernate JIRA </a>
+ *
+ * @author Erik-Berndt Scheper
+ */
+public class DefaultValueComponents extends AbstractEntityTest {
+ private static final Logger log = LoggerFactory
+ .getLogger(DefaultValueComponents.class);
+
+ private Integer id0;
+ private Integer id1;
+ private Integer id2;
+ private Integer id3;
+ private Integer id4;
+ private Integer id5;
+ private Integer id6;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(DefaultValueComponentTestEntity.class);
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ // Revision 1
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+
+ DefaultValueComponentTestEntity cte0 = DefaultValueComponentTestEntity
+ .of(null);
+
+ DefaultValueComponentTestEntity cte1 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of("c1-str1", null));
+
+ DefaultValueComponentTestEntity cte2 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of("c1-str1", DefaultValueComponent2
+ .of("c2-str1", "c2-str2")));
+
+ DefaultValueComponentTestEntity cte3 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ "c2-str1", "c2-str2")));
+
+ DefaultValueComponentTestEntity cte4 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ null, "c2-str2")));
+
+ DefaultValueComponentTestEntity cte5 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ "c2-str1", null)));
+
+ DefaultValueComponentTestEntity cte6 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ null, null)));
+
+ em.persist(cte0);
+ em.persist(cte1);
+ em.persist(cte2);
+ em.persist(cte3);
+ em.persist(cte4);
+ em.persist(cte5);
+ em.persist(cte6);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em = getEntityManager();
+ em.getTransaction().begin();
+
+ cte0 = em.find(DefaultValueComponentTestEntity.class, cte0.getId());
+ cte1 = em.find(DefaultValueComponentTestEntity.class, cte1.getId());
+ cte2 = em.find(DefaultValueComponentTestEntity.class, cte2.getId());
+ cte3 = em.find(DefaultValueComponentTestEntity.class, cte3.getId());
+ cte4 = em.find(DefaultValueComponentTestEntity.class, cte4.getId());
+ cte5 = em.find(DefaultValueComponentTestEntity.class, cte5.getId());
+ cte6 = em.find(DefaultValueComponentTestEntity.class, cte6.getId());
+
+ cte0.setComp1(DefaultValueComponent1.of("upd-c1-str1", null));
+ cte1.setComp1(DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "upd-c2-str2")));
+ cte2.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte3.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte4.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte5.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte6.getComp1().getComp2().setStr1("upd-c2-str1");
+
+ em.getTransaction().commit();
+
+ // afterwards
+ id0 = cte0.getId();
+ id1 = cte1.getId();
+ id2 = cte2.getId();
+ id3 = cte3.getId();
+ id4 = cte4.getId();
+ id5 = cte5.getId();
+ id6 = cte6.getId();
+ }
+
+ @Test
+ public void testRevisionsCounts() {
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id0).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id1).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id2).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id3).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id4).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id5).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id6).toString());
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id0));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id1));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id2));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id3));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id4));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id5));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id6));
+ }
+
+ @Test
+ public void testHistoryOfId0() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id0, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id0, 2);
+
+ log.error("------------ id0 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ checkCorrectlyPersisted(id0, null, null);
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id0, DefaultValueComponent1.of(null, null));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id0, DefaultValueComponent1.of("upd-c1-str1", null));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId1() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id1, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id1, 2);
+
+ log.error("------------ id1 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ checkCorrectlyPersisted(id1, null, "upd-c2-str1");
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id1, DefaultValueComponent1.of("c1-str1", null));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id1, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "upd-c2-str2")));
+
+ assert ent2.equals(expectedVer2);
+ assert ent1.equals(expectedVer1);
+ }
+
+ @Test
+ public void testHistoryOfId2() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id2, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id2, 2);
+
+ log.error("------------ id2 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id2, DefaultValueComponent1.of("c1-str1",
+ DefaultValueComponent2.of("c2-str1", "c2-str2")));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id2, DefaultValueComponent1.of("c1-str1",
+ DefaultValueComponent2.of("upd-c2-str1", "c2-str2")));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId3() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id3, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id3, 2);
+
+ log.error("------------ id3 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id3, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("c2-str1", "c2-str2")));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id3, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "c2-str2")));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId4() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id4, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id4, 2);
+
+ log.error("------------ id4 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id4, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of(null, "c2-str2")));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id4, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "c2-str2")));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId5() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id5, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id5, 2);
+
+ log.error("------------ id5 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id5, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("c2-str1", null)));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id5, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", null)));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId6() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id6, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id6, 2);
+
+ log.error("------------ id6 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id6, DefaultValueComponent1.of(null, null));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id6, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", null)));
+
+ assert ent2.equals(expectedVer2);
+ assert ent1.equals(expectedVer1);
+ }
+
+ private void checkCorrectlyPersisted(Integer expectedId,
+ String expectedComp2Str1Rev1, String expectedComp2Str1Rev2) {
+ // Verify that the entity was correctly persisted
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+ Long entCount = (Long) em.createQuery(
+ "select count(s) from DefaultValueComponentTestEntity s where s.id = "
+ + expectedId.toString()).getSingleResult();
+ BigInteger auditCount = (BigInteger) em.createNativeQuery(
+ "select count(ID) from DefaultValueComponentTestEntity_AUD s where s.id = "
+ + expectedId.toString()).getSingleResult();
+ String comp2Str1Rev1 = (String) em
+ .createNativeQuery(
+ "select COMP2_STR1 from DefaultValueComponentTestEntity_AUD s where rev=1 and s.id = "
+ + expectedId.toString()).getSingleResult();
+ String comp2Str1Rev2 = (String) em
+ .createNativeQuery(
+ "select COMP2_STR1 from DefaultValueComponentTestEntity_AUD s where rev=2 and s.id = "
+ + expectedId.toString()).getSingleResult();
+ assert Long.valueOf(1L).equals(entCount);
+ assert BigInteger.valueOf(2L).equals(auditCount);
+
+ if (expectedComp2Str1Rev1 == null) {
+ assert comp2Str1Rev1 == null;
+ } else {
+ assert expectedComp2Str1Rev1.equals(comp2Str1Rev1);
+ }
+
+ if (expectedComp2Str1Rev2 == null) {
+ assert comp2Str1Rev2 == null;
+ } else {
+ assert expectedComp2Str1Rev2.equals(comp2Str1Rev2);
+ }
+ em.getTransaction().commit();
+ }
+}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -27,10 +27,7 @@
import javax.persistence.EntityManager;
import org.hibernate.envers.test.AbstractEntityTest;
-import org.hibernate.envers.test.entities.ids.EmbId;
-import org.hibernate.envers.test.entities.ids.EmbIdTestEntity;
-import org.hibernate.envers.test.entities.ids.MulId;
-import org.hibernate.envers.test.entities.ids.MulIdTestEntity;
+import org.hibernate.envers.test.entities.ids.*;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -44,10 +41,13 @@
private EmbId id2;
private MulId id3;
private MulId id4;
+ private EmbIdWithCustomType id5;
+ private EmbIdWithCustomType id6;
public void configure(Ejb3Configuration cfg) {
cfg.addAnnotatedClass(EmbIdTestEntity.class);
cfg.addAnnotatedClass(MulIdTestEntity.class);
+ cfg.addAnnotatedClass(EmbIdWithCustomTypeTestEntity.class);
}
@BeforeClass(dependsOnMethods = "init")
@@ -56,6 +56,8 @@
id2 = new EmbId(10, 20);
id3 = new MulId(100, 101);
id4 = new MulId(102, 103);
+ id5 = new EmbIdWithCustomType(25, CustomEnum.NO);
+ id6 = new EmbIdWithCustomType(27, CustomEnum.YES);
// Revision 1
EntityManager em = getEntityManager();
@@ -63,6 +65,7 @@
em.persist(new EmbIdTestEntity(id1, "x"));
em.persist(new MulIdTestEntity(id3.getId1(), id3.getId2(), "a"));
+ em.persist(new EmbIdWithCustomTypeTestEntity(id5, "c"));
em.getTransaction().commit();
@@ -72,6 +75,7 @@
em.persist(new EmbIdTestEntity(id2, "y"));
em.persist(new MulIdTestEntity(id4.getId1(), id4.getId2(), "b"));
+ em.persist(new EmbIdWithCustomTypeTestEntity(id6, "d"));
em.getTransaction().commit();
@@ -83,11 +87,15 @@
EmbIdTestEntity ete2 = em.find(EmbIdTestEntity.class, id2);
MulIdTestEntity mte3 = em.find(MulIdTestEntity.class, id3);
MulIdTestEntity mte4 = em.find(MulIdTestEntity.class, id4);
+ EmbIdWithCustomTypeTestEntity cte5 = em.find(EmbIdWithCustomTypeTestEntity.class, id5);
+ EmbIdWithCustomTypeTestEntity cte6 = em.find(EmbIdWithCustomTypeTestEntity.class, id6);
ete1.setStr1("x2");
ete2.setStr1("y2");
mte3.setStr1("a2");
mte4.setStr1("b2");
+ cte5.setStr1("c2");
+ cte6.setStr1("d2");
em.getTransaction().commit();
@@ -98,11 +106,15 @@
ete1 = em.find(EmbIdTestEntity.class, id1);
ete2 = em.find(EmbIdTestEntity.class, id2);
mte3 = em.find(MulIdTestEntity.class, id3);
+ cte5 = em.find(EmbIdWithCustomTypeTestEntity.class, id5);
+ cte6 = em.find(EmbIdWithCustomTypeTestEntity.class, id6);
em.remove(ete1);
em.remove(mte3);
+ em.remove(cte6);
ete2.setStr1("y3");
+ cte5.setStr1("c3");
em.getTransaction().commit();
@@ -126,6 +138,10 @@
assert Arrays.asList(1, 3, 4).equals(getAuditReader().getRevisions(MulIdTestEntity.class, id3));
assert Arrays.asList(2, 3).equals(getAuditReader().getRevisions(MulIdTestEntity.class, id4));
+
+ assert Arrays.asList(1, 3, 4).equals(getAuditReader().getRevisions(EmbIdWithCustomTypeTestEntity.class, id5));
+
+ assert Arrays.asList(2, 3, 4).equals(getAuditReader().getRevisions(EmbIdWithCustomTypeTestEntity.class, id6));
}
@Test
@@ -176,4 +192,29 @@
assert getAuditReader().find(MulIdTestEntity.class, id4, 4).equals(ver2);
assert getAuditReader().find(MulIdTestEntity.class, id4, 5).equals(ver2);
}
+
+ @Test
+ public void testHistoryOfId5() {
+ EmbIdWithCustomTypeTestEntity ver1 = new EmbIdWithCustomTypeTestEntity(id5, "c");
+ EmbIdWithCustomTypeTestEntity ver2 = new EmbIdWithCustomTypeTestEntity(id5, "c2");
+ EmbIdWithCustomTypeTestEntity ver3 = new EmbIdWithCustomTypeTestEntity(id5, "c3");
+
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 1).equals(ver1);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 2).equals(ver1);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 3).equals(ver2);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 4).equals(ver3);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 5).equals(ver3);
+ }
+
+ @Test
+ public void testHistoryOfId6() {
+ EmbIdWithCustomTypeTestEntity ver1 = new EmbIdWithCustomTypeTestEntity(id6, "d");
+ EmbIdWithCustomTypeTestEntity ver2 = new EmbIdWithCustomTypeTestEntity(id6, "d2");
+
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 1) == null;
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 2).equals(ver1);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 3).equals(ver2);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 4) == null;
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 5) == null;
+ }
}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@Audited
+public class DetailSubclass extends DetailSuperclass {
+
+ private String str2;
+
+ public DetailSubclass() {
+
+ }
+
+ public String getStr2() {
+ return str2;
+ }
+
+ public void setStr2(String str2) {
+ this.str2 = str2;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@Audited
+public class DetailSubclass2 extends DetailSubclass {
+
+ private String str3;
+
+ public DetailSubclass2() {
+
+ }
+
+ public String getStr3() {
+ return str3;
+ }
+
+ public void setStr3(String str3) {
+ this.str3 = str3;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,38 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+@Audited
+public class DetailSuperclass {
+
+ private long id;
+
+ private List<Master> masters;
+
+ public DetailSuperclass() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public List<Master> getMasters() {
+ return masters;
+ }
+
+ public void setMasters(List<Master> masters) {
+ this.masters = masters;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,114 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ManyToManyInverseToSuperclassTest extends AbstractEntityTest {
+
+ private long m1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ try {
+ URL url = Thread.currentThread().getContextClassLoader()
+ .getResource(
+ "mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml");
+ cfg.addFile(new File(url.toURI()));
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ Master m1 = new Master();
+ DetailSubclass det1 = new DetailSubclass2();
+
+ // Revision 1
+ em.getTransaction().begin();
+
+ det1.setStr2("detail 1");
+
+ m1.setStr("master");
+ m1.setItems(new ArrayList<DetailSubclass>());
+ m1.getItems().add(det1);
+
+ det1.setMasters(new ArrayList<Master>());
+ det1.getMasters().add(m1);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+ m1_id = m1.getId();
+
+ // Revision 2
+// em.getTransaction().begin();
+//
+// m1 = em.find(Master.class, m1_id);
+//
+// det2.setStr2("detail 2");
+// det2.setParent(m1);
+// m1.getItems().add(det2);
+// em.getTransaction().commit();
+//
+// // Revision 3
+// em.getTransaction().begin();
+//
+// m1 = em.find(Master.class, m1_id);
+// m1.setStr("new master");
+//
+// det1 = m1.getItems().get(0);
+// det1.setStr2("new detail");
+// DetailSubclass det3 = new DetailSubclass2();
+// det3.setStr2("detail 3");
+// det3.setParent(m1);
+//
+// m1.getItems().get(1).setParent(null);
+// // m1.getItems().remove(1);
+// m1.getItems().add(det3);
+//
+// em.persist(m1);
+// em.getTransaction().commit();
+//
+// // Revision 4
+// em.getTransaction().begin();
+//
+// m1 = em.find(Master.class, m1_id);
+//
+// det1 = m1.getItems().get(0);
+// det1.setParent(null);
+// // m1.getItems().remove(det1);
+//
+// em.persist(m1);
+// em.getTransaction().commit();
+
+ }
+
+ @Test
+ public void testHistoryExists() {
+ Master rev1_1 = getAuditReader().find(Master.class, m1_id, 1);
+ Master rev1_2 = getAuditReader().find(Master.class, m1_id, 2);
+ Master rev1_3 = getAuditReader().find(Master.class, m1_id, 3);
+ Master rev1_4 = getAuditReader().find(Master.class, m1_id, 4);
+
+ assert (rev1_1 != null);
+ assert (rev1_2 != null);
+ assert (rev1_3 != null);
+ assert (rev1_4 != null);
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+@Audited
+public class Master {
+
+ private long id;
+
+ private String str;
+
+ private List<DetailSubclass> items;
+
+ public Master() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getStr() {
+ return str;
+ }
+
+ public void setStr(String str) {
+ this.str = str;
+ }
+
+ public List<DetailSubclass> getItems() {
+ return items;
+ }
+
+ public void setItems(List<DetailSubclass> items) {
+ this.items = items;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@Audited
+public class DetailSubclass extends DetailSuperclass {
+
+ private String str2;
+
+ public DetailSubclass() {
+
+ }
+
+ public String getStr2() {
+ return str2;
+ }
+
+ public void setStr2(String str2) {
+ this.str2 = str2;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@Audited
+public class DetailSubclass2 extends DetailSubclass {
+
+ private String str3;
+
+ public DetailSubclass2() {
+
+ }
+
+ public String getStr3() {
+ return str3;
+ }
+
+ public void setStr3(String str3) {
+ this.str3 = str3;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,36 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@Audited
+public class DetailSuperclass {
+
+ private long id;
+
+ private Master parent;
+
+ public DetailSuperclass() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Master getParent() {
+ return parent;
+ }
+
+ public void setParent(Master parent) {
+ this.parent = parent;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+@Audited
+public class Master {
+
+ private long id;
+
+ private String str;
+
+ private List<DetailSubclass> items;
+
+ public Master() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getStr() {
+ return str;
+ }
+
+ public void setStr(String str) {
+ this.str = str;
+ }
+
+ public List<DetailSubclass> getItems() {
+ return items;
+ }
+
+ public void setItems(List<DetailSubclass> items) {
+ this.items = items;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,113 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class OneToManyInverseToSuperclassTest extends AbstractEntityTest {
+
+ private long m1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ try {
+ URL url = Thread.currentThread().getContextClassLoader()
+ .getResource(
+ "mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml");
+ cfg.addFile(new File(url.toURI()));
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ Master m1 = new Master();
+ DetailSubclass det1 = new DetailSubclass2();
+ DetailSubclass det2 = new DetailSubclass2();
+
+ // Revision 1
+ em.getTransaction().begin();
+
+ det1.setStr2("detail 1");
+
+ m1.setStr("master");
+ m1.setItems(new ArrayList<DetailSubclass>());
+ m1.getItems().add(det1);
+ det1.setParent(m1);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+ m1_id = m1.getId();
+
+ // Revision 2
+ em.getTransaction().begin();
+
+ m1 = em.find(Master.class, m1_id);
+
+ det2.setStr2("detail 2");
+ det2.setParent(m1);
+ m1.getItems().add(det2);
+ em.getTransaction().commit();
+
+ // Revision 3
+ em.getTransaction().begin();
+
+ m1 = em.find(Master.class, m1_id);
+ m1.setStr("new master");
+
+ det1 = m1.getItems().get(0);
+ det1.setStr2("new detail");
+ DetailSubclass det3 = new DetailSubclass2();
+ det3.setStr2("detail 3");
+ det3.setParent(m1);
+
+ m1.getItems().get(1).setParent(null);
+ // m1.getItems().remove(1);
+ m1.getItems().add(det3);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+
+ // Revision 4
+ em.getTransaction().begin();
+
+ m1 = em.find(Master.class, m1_id);
+
+ det1 = m1.getItems().get(0);
+ det1.setParent(null);
+ // m1.getItems().remove(det1);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+
+ }
+
+ @Test
+ public void testHistoryExists() {
+ Master rev1_1 = getAuditReader().find(Master.class, m1_id, 1);
+ Master rev1_2 = getAuditReader().find(Master.class, m1_id, 2);
+ Master rev1_3 = getAuditReader().find(Master.class, m1_id, 3);
+ Master rev1_4 = getAuditReader().find(Master.class, m1_id, 4);
+
+ assert (rev1_1 != null);
+ assert (rev1_2 != null);
+ assert (rev1_3 != null);
+ assert (rev1_4 != null);
+ }
+
+}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -49,12 +49,15 @@
StrTestEntity te = new StrTestEntity("x");
em.persist(te);
em.getTransaction().commit();
+ }
+ @Test(dependsOnMethods = "testTransactionRollback")
+ public void testDataNotPersisted() {
// Checking if the entity became persisted
- em = getEntityManager();
+ EntityManager em = getEntityManager();
em.getTransaction().begin();
Long count = (Long) em.createQuery("select count(s) from StrTestEntity s where s.str = 'x'").getSingleResult();
assert count == 0l;
em.getTransaction().commit();
}
-}
\ No newline at end of file
+}
Added: core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,46 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+ <session-factory>
+ <property name="hbm2ddl.auto">create-drop</property>
+
+ <property name="show_sql">false</property>
+ <property name="format_sql">false</property>
+
+ <property name="dialect">org.hibernate.dialect.H2Dialect</property>
+ <property name="connection.url">jdbc:h2:mem:envers</property>
+ <property name="connection.driver_class">org.h2.Driver</property>
+ <property name="connection.username">sa</property>
+ <property name="connection.password"></property>
+
+ <!--<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>-->
+ <!--<property name="connection.url">jdbc:mysql:///hibernate_tests?useUnicode=true&characterEncoding=UTF-8</property>-->
+ <!--<property name="connection.driver_class">com.mysql.jdbc.Driver</property>-->
+ <!--<property name="connection.username">root</property>-->
+ <!--<property name="connection.password"></property>-->
+
+ <!--<property name="hibernate.jdbc.batch_size">100</property>-->
+
+ <event type="post-insert">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="post-update">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="post-delete">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="pre-collection-update">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="pre-collection-remove">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="post-collection-recreate">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ </session-factory>
+</hibernate-configuration>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.auditedEntity.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_person" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Person"
+ entity-name="Personaje">
+
+ <id name="id" column="ID_PERSON" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255" column="NAME"
+ not-null="true" />
+
+ <property name="age" type="int" column="AGE" />
+
+ <bag name="cars" inverse="true" table="PERSON_CAR" >
+ <key column="ID_CAR" />
+ <many-to-many
+ class="org.hibernate.envers.test.entityNames.manyToManyAudited.Car" column="ID_PERSON"/>
+ </bag>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Car">
+
+ <id name="id" column="ID_CAR" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" not-null="true" />
+
+ <bag name="owners" cascade="all" table="PERSON_CAR" >
+ <key column="ID_PERSON" />
+ <many-to-many entity-name="Personaje" column="ID_CAR"/>
+ </bag>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_PERSON" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" >
+
+ <id name="id" column="ID_CAR" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <bag name="owners" cascade="save-update">
+ <key column="ID_GARAGE" not-null="true" update="false" />
+ <one-to-many entity-name="Personaje"/>
+ </bag>
+
+ </class>
+
+<!-- <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Garage" >-->
+<!---->
+<!-- <id name="id" column="ID_GARAGE" type="long">-->
+<!-- <generator class="native" />-->
+<!-- </id>-->
+<!---->
+<!-- <property name="name" type="int" column="int" not-null="true" />-->
+<!---->
+<!-- <bag name="cars" cascade="save-update">-->
+<!-- <key column="ID_GARAGE" not-null="true" update="false" />-->
+<!-- <one-to-many class="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" />-->
+<!-- </bag>-->
+<!-- -->
+<!-- </class> -->
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_PERSON" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Car" >
+
+ <id name="id" column="ID_CAR" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <bag name="owners" cascade="save-update">
+ <key column="ID_GARAGE" not-null="true" update="false" />
+ <one-to-many entity-name="Personaje"/>
+ </bag>
+
+ </class>
+
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_person" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Car" >
+
+ <id name="id" column="ID_BED" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <many-to-one name="owner" entity-name="Personaje"/>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_person" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Car" >
+
+ <id name="id" column="ID_BED" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <many-to-one name="owner" entity-name="Personaje"/>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="WINDOWS-1251"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.Master"
+ table="HIB_MASTER_ENTITY">
+
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+
+ <property name="str" column="STR" />
+
+ <bag name="items" lazy="true" cascade="all" access="property" inverse="true"
+ table="HIB_MASTER_DETAIL">
+ <key column="ID_MASTER" />
+ <many-to-many
+ class="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass2"
+ column="ID_DETAIL" />
+ </bag>
+ </class>
+
+
+ <class
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSuperclass"
+ table="HIB_DETAIL_ENTITY" abstract="true">
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+ <discriminator column="DISCRIMINATOR" type="string" />
+
+ <bag name="masters" lazy="true" access="property" table="HIB_MASTER_DETAIL">
+ <key column="ID_DETAIL" />
+ <many-to-many
+ class="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.Master"
+ column="ID_MASTER" />
+ </bag>
+
+ <subclass
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass"
+ discriminator-value="SUB">
+ <property name="str2" column="STR2" />
+
+ <subclass
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass2"
+ discriminator-value="SUB2"
+ extends="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass">
+ <property name="str3" column="STR3" />
+
+ </subclass>
+
+ </subclass>
+ </class>
+
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="WINDOWS-1251"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.Master"
+ table="HIB_MASTER_ENTITY">
+
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+
+ <property name="str" column="STR" />
+
+ <bag name="items" lazy="true" cascade="all" access="property"
+ inverse="true">
+ <key column="ID_MASTER" />
+ <one-to-many
+ class="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass2" />
+ </bag>
+ </class>
+
+
+ <class
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSuperclass"
+ table="HIB_DETAIL_ENTITY" abstract="true">
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+ <discriminator column="DISCRIMINATOR" type="string" />
+
+ <many-to-one name="parent" column="ID_MASTER"
+ class="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.Master" />
+
+ <subclass
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass"
+ discriminator-value="SUB">
+ <property name="str2" column="STR2" />
+
+ <subclass
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass2"
+ discriminator-value="SUB2" extends="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass">
+ <property name="str3" column="STR3" />
+
+ </subclass>
+
+ </subclass>
+ </class>
+
+
+</hibernate-mapping>
Modified: core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/testng.xml 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/resources/testng.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -41,8 +41,10 @@
<package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.subclass" />
<package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.joined" />
<package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.union" />
+ <package name="org.hibernate.envers.test.integration.jta" />
<package name="org.hibernate.envers.test.integration.manytomany" />
<package name="org.hibernate.envers.test.integration.manytomany.biowned" />
+ <package name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass" />
<package name="org.hibernate.envers.test.integration.manytomany.sametable" />
<package name="org.hibernate.envers.test.integration.manytomany.ternary" />
<package name="org.hibernate.envers.test.integration.manytomany.unidirectional" />
@@ -53,6 +55,7 @@
<package name="org.hibernate.envers.test.integration.notinsertable.manytoone" />
<package name="org.hibernate.envers.test.integration.onetomany" />
<package name="org.hibernate.envers.test.integration.onetomany.detached" />
+ <package name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass" />
<package name="org.hibernate.envers.test.integration.onetoone.bidirectional" />
<package name="org.hibernate.envers.test.integration.onetoone.bidirectional.ids" />
<package name="org.hibernate.envers.test.integration.onetoone.unidirectional" />
@@ -69,6 +72,13 @@
<package name="org.hibernate.envers.test.integration.secondary.ids" />
<package name="org.hibernate.envers.test.integration.serialization" />
<package name="org.hibernate.envers.test.integration.superclass" />
+
+ <package name="org.hibernate.envers.test.entityNames.auditedEntity" />
+ <package name="org.hibernate.envers.test.entityNames.manyToManyAudited" />
+ <package name="org.hibernate.envers.test.entityNames.oneToManyAudited" />
+ <package name="org.hibernate.envers.test.entityNames.oneToManyNotAudited" />
+ <package name="org.hibernate.envers.test.entityNames.singleAssociatedAudited" />
+ <package name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited" />
</packages>
</test>
</suite>
13 years, 8 months
Hibernate SVN: r20211 - in core/branches/Branch_3_5: testsuite/src/test/java/org/hibernate/test/cascade and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: gbadner
Date: 2010-08-20 13:23:03 -0400 (Fri, 20 Aug 2010)
New Revision: 20211
Modified:
core/branches/Branch_3_5/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java
core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java
Log:
HHH-3334 : Cascade-save breaks if parent ID is assigned (delays insert) and child has identity ID (early insert) (Wallace Wadge)
Modified: core/branches/Branch_3_5/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java
===================================================================
--- core/branches/Branch_3_5/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java 2010-08-20 17:18:44 UTC (rev 20210)
+++ core/branches/Branch_3_5/core/src/main/java/org/hibernate/event/def/AbstractSaveEventListener.java 2010-08-20 17:23:03 UTC (rev 20211)
@@ -263,11 +263,6 @@
boolean inTxn = source.getJDBCContext().isTransactionInProgress();
boolean shouldDelayIdentityInserts = !inTxn && !requiresImmediateIdAccess;
- if ( useIdentityColumn && !shouldDelayIdentityInserts ) {
- log.trace( "executing insertions" );
- source.getActionQueue().executeInserts();
- }
-
// Put a placeholder in entries, so we don't recurse back and try to save() the
// same object again. QUESTION: should this be done before onSave() is called?
// likewise, should it be done before onUpdate()?
@@ -287,6 +282,11 @@
cascadeBeforeSave( source, persister, entity, anything );
+ if ( useIdentityColumn && !shouldDelayIdentityInserts ) {
+ log.trace( "executing insertions" );
+ source.getActionQueue().executeInserts();
+ }
+
Object[] values = persister.getPropertyValuesToInsert( entity, getMergeMap( anything ), source );
Type[] types = persister.getPropertyTypes();
Modified: core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java
===================================================================
--- core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java 2010-08-20 17:18:44 UTC (rev 20210)
+++ core/branches/Branch_3_5/testsuite/src/test/java/org/hibernate/test/cascade/CascadeTestWithAssignedParentIdTest.java 2010-08-20 17:23:03 UTC (rev 20211)
@@ -59,44 +59,7 @@
return new FunctionalTestClassTestSuite( CascadeTestWithAssignedParentIdTest.class );
}
-
- /**
- * Saves the child object with the parent when both the one-to-many and
- * many-to-one associations use cascade="all"
- */
- public void testSaveChildWithParentFailureExpected() {
- if ( ! IdentityGenerator.class.isAssignableFrom( getDialect().getNativeIdentifierGeneratorClass() ) ) {
- reportSkip( "FailureExpected test passes when native id generator is not IdentityGenerator",
- "parent insert is assigned (delayed) when child is identity (early insert)" );
- fail( "test is expected to fail" );
- return;
- }
- Session session = openSession();
- Transaction txn = session.beginTransaction();
- Parent parent = new Parent();
- Child child = new Child();
- child.setParent( parent );
- parent.setChildren( Collections.singleton( child ) );
- parent.setId(new Long(123L));
- // this should figure out that the parent needs saving first since id is assigned.
- session.save( child );
- txn.commit();
- session.close();
-
- session = openSession();
- txn = session.beginTransaction();
- parent = ( Parent ) session.get( Parent.class, parent.getId() );
- assertEquals( 1, parent.getChildren().size() );
- txn.commit();
- session.close();
- }
-
public void testSaveChildWithParent() {
- if ( IdentityGenerator.class.isAssignableFrom( getDialect().getNativeIdentifierGeneratorClass() ) ) {
- reportSkip( "test is known to fail when native id generator is IdentityGenerator",
- "parent insert is assigned (delayed) when child has identity (early insert)" );
- return;
- }
Session session = openSession();
Transaction txn = session.beginTransaction();
Parent parent = new Parent();
13 years, 8 months