标签: hibernate-annotations

如何重构@Transactional方法来拆分非事务性部分

我有一个数据访问类,它作为独立的Java应用程序的一部分运行.它目前正在工作,这意味着定义了一个事务管理器,但我想重构该类以减少事务的范围,但如果我这样做,我得到org.hibernate.HibernateException:没有Hibernate Session绑定到线程,并且配置不允许在这里创建非事务性的,这意味着移动@Transactional会以某种方式阻止它被识别.

我的原始版本的重构方法是私有的,但我发现建议将其更改为public,因为在某些情况下注释不会被选中.

public class DoStuff {
    @Transactional
    public void originalMethod() {
        // do database stuff
        ...

        // do non-database stuff that is time consuming
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是重构以下内容

public class DoStuff {
    public void originalMethod() {
        doDatabaseStuff()

        doNonDatabaseStuff()
    }

    @Transactional
    public void doDatabaseStuff() {
        ...
    }

    public void doNonDatabaseStuff() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

java hibernate transactions spring-annotations hibernate-annotations

6
推荐指数
1
解决办法
1953
查看次数

如何测试@Valid

在我的实体中,我有一些用于验证的休眠注释,例如 @NotEmpty、@Pattern.. 等

在我的控制器中,在保存操作时,它有一个 @Valid 参数。

但是如果任何实体有任何必填字段,并且没有注释,我就会遇到问题。

所以我想测试每个实体,以确保他们有必要的笔记。

就像是:

@Test(expect=IllegalArgumentException.class)
public void testAllNull() {
    Person p = new Persson(); // Person name has an @NotEmpty
    validator.validate(p);
}
Run Code Online (Sandbox Code Playgroud)

但是如何验证呢?谁被要求检查@Valid?

谢谢。

junit annotations spring-annotations hibernate-annotations

6
推荐指数
1
解决办法
1万
查看次数

如何覆盖子类中的@GeneratedValue

如果我在超类中只有 GeneratedValue 并且在子类中有特定的生成器类型,我该如何覆盖此功能。

超级班:

@Id
@GeneratedValue
private Long id;
Run Code Online (Sandbox Code Playgroud)

子类:

@Id
@SequenceGenerator(name = "a", sequenceName = "a")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "a")
private Long id;
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-annotations

6
推荐指数
0
解决办法
2070
查看次数

如何使用Annotations和纯Java在Spring中设置hibernate.hbm2ddl.auto

如何仅使用Java和注释在Spring中设置以下内容.

<property name="hibernate.hbm2ddl.auto" value="update"/>

我应该是可能的,我相信让xml项目免费更清洁.

PS:这应该不重要,但我在Heroku上运行它.

java spring hibernate spring-annotations hibernate-annotations

6
推荐指数
1
解决办法
8251
查看次数

映射实现接口的Enum类型的集合

我有一个棘手的事情,我正试图用Enums映射存储静态数据.

它从声明为这样的枚举类开始:

interface MyInterface {
    String getName();
}

public enum A implements MyInterface {
FIRST_A("First A");
private final String name;
private A(String name) {
this.name = name;
}
public String getName() {
return name;
}

public String toString() {
return name;
}
}

public enum B implements MyInterface {
FIRST_B("First B");
private final String name;
private B(String name) {
this.name = name;
}
public String getName() {
return name;
}

public String toString() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)

现在我想将它们用作:

List<MyInterface> …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa hibernate-annotations

5
推荐指数
1
解决办法
2418
查看次数

单个实体中的多个@id注释

在实体Vs,Composite Id中使用多个@Id有什么区别?

另外,当没有为嵌入式对象单独创建的表时,这个@EmbeddedId如何工作?

hibernate hibernate-annotations

5
推荐指数
1
解决办法
1万
查看次数

如何让Hibernate Filters在JPA中工作?

我有以下实体类:


@Entity
@FilterDef (name = "byLastName", parameters = @Parameter (name = "lastName", type="string"))
@Filters ({
    @Filter (name = "byLastName", condition = "lastName = :lastName")
})
public class User {
    String firstName;
    String lastName;
}
Run Code Online (Sandbox Code Playgroud)

在我的DAO中,我这样做:


public User findById (Long id)
{
   Session s = (Session) em.getDelegate ( );
   s.enableFilter ("byLastName").setParameter ("lastName", "smith");

   User u = em.find (User.class, id);
   return (u);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我正确理解了这一点,那么应该应用过滤器,如果lastName不等于"smith",我尝试检索的任何用户都应该返回null.问题是过滤器似乎没有应用.我尝试从数据库中检索的任何用户,无论lastName的值是什么,都会被返回.

我误解过滤器是如何工作的吗?或者我错过了我如何配置的内容?请注意,我没有使用hibernate.cfg.xml; 使用JPA和注释为我配置了所有内容.

任何帮助将不胜感激.

谢谢.

hibernate hibernate-annotations

5
推荐指数
1
解决办法
6352
查看次数

休眠错误:在hbm2java代码上混合可为空和不可为空的属性

我正在使用hibernate3-maven-plugin来查询Oracle10g数据库并使用hbm2java目标生成带有JPA批注的Java类。然后,我使用spring配置一个会话工厂,该工厂扫描带注释的代码。

经过长时间的努力hbm2java,我设法生成了类,但现在又遇到了另一个问题:加载带注释的类时,出现“不允许在属性中混合可为空和不可为空的列”的异常。

数据库定义表FOO和BAR如下:

CREATE TABLE FOO (
  STATUS_CODE ... NOT NULL,
  REASON_CODE ...);

ALTER TABLE FOO ADD (
  CONSTRAINT FK_BAR
  FOREIGN KEY (REASON_CODE, STATUS_CODE)
  REFERENCES BAR(REASON_CODE, STATUS_CODE));

CREATE TABLE BAR (
  STATUS_CODE ... NOT NULL,
  REASON_CODE ... NOT NULL);

ALTER TABLE BAR (
  PRIMARY KEY (REASON_CODE, STATUS_CODE));
Run Code Online (Sandbox Code Playgroud)

因此,表FOO具有两列,它们是表BAR中的外键。列FOO.STATUS_CODE必须为非空,但列FOO.REASON_CODE可以为空。这里的逻辑是FOO需要一个状态,但并非每个状态都需要一个原因。

表BAR具有列BAR.REASON_CODE和BAR.STATUS_CODE,它们都不为空。此处的逻辑将各种(但不是全部)状态代码的原因关联在一起。因此,例如,如果状态为“已取消”,则原因可能是“欺诈”,“无能”等。

注意,诸如“活动”的状态没有任何关联的原因,因此在表BAR中不存在,但是它可以作为状态代码出现在表FOO中(没有关联的原因代码)。但是,如果FOO中的行的状态代码为“已取消”,则它还必须具有表BAR中为该状态定义的原因代码之一。

因此,表定义对我来说似乎不错(尽管我不是数据库专家)。

现在hbm2java,maven中的目标为表FOO生成以下代码:

private Bar bar;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns( { 
    @JoinColumn(name="REASON_CODE", referencedColumnName="REASON_CODE"), 
    @JoinColumn(name="STATUS_CODE", referencedColumnName="STATUS_CODE", nullable=false) } )
public Bar getBar() {
    return …
Run Code Online (Sandbox Code Playgroud)

hibernate hbm2java hibernate-annotations hibernate3-maven-plugin

5
推荐指数
0
解决办法
1560
查看次数

回滚无法使用hibernate

我正在尝试使用hibernate的logback,看起来很简单,但我无法让它工作

的hibernate.cfg.xml

    <!-- DB Properties -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="hibernate.current_session_context_class">thread</property>

    <!-- DB Connection -->
     <property name="hibernate.connection.url"> XXXXXXXXXXXXX</property>
    <property name="connection.username">XXXXXXXXXX</property>
    <property name="connection.password">XXXXXXXXXX</property>


    <!-- c3p0 config  -->

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>     
    <property name="hibernate.c3p0.acquire_increment">1</property>
    <property name="hibernate.c3p0.idle_test_period">100</property>
    <property name="hibernate.c3p0.min_size">10</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.timeout">1800</property>


</session-factory>
Run Code Online (Sandbox Code Playgroud)

logback.xml

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>%d{yyyy-MM-dd_HH:mm:ss.SSS} %-5level %logger{36} - %msg%n
        </Pattern>
    </encoder>
</appender>

<appender name="FILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>c:/timesheet.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <Pattern>%d{yyyy-MM-dd_HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
            %msg%n
        </Pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <FileNamePattern>c:/timesheet.%i.log.zip</FileNamePattern>
        <MinIndex>1</MinIndex>
        <MaxIndex>10</MaxIndex>
    </rollingPolicy>

    <triggeringPolicy
        class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> …
Run Code Online (Sandbox Code Playgroud)

hibernate logback c3p0 hibernate-annotations

5
推荐指数
1
解决办法
3957
查看次数

java 7升级和hibernate注释处理器错误

我收到以下警告,这似乎是触发后续警告和错误.我一直在谷歌搜索疯狂,但没有找到任何清楚说明我应该做什么来解决这个问题.执行Ant构建时会发生此问题.我正在尝试将项目迁移到Java 7.我已将所有source ='1.6'和target ="1.6"更改为1.7.

我确实找到了这篇相关的文章:转发兼容的Java 6注释处理器和SupportedSourceVersion

它似乎表明我应该自己构建Hibernate注释处理器jar,用1.7编译它.似乎我不应该被要求这样做.有问题的类的最新版本(在hibernate-validator-annotation-processor-5.0.1.Final.jar中)已经用1.6编译.由于所述类中的代码引用SourceVersion.latestSupported(),并且1.6中的代码仅返回RELEASE_6,因此似乎没有通常可用的解决方案.

这是警告:

[javac] warning: Supported source version 'RELEASE_6' from annotation processor 'org.hibernate.validator.ap.ConstraintValidationProcessor' less than -source '1.7'
Run Code Online (Sandbox Code Playgroud)

并且,以下是后续警告/错误.

[javac] warning: No processor claimed any of these annotations: javax.persistence.PersistenceContext,javax.persistence.Column,org.codehaus.jackson.annotate.JsonIgnore,javax.persistence.Id,org.springframework.context.annotation.DependsOn,com.trgr.cobalt.infrastructure.datasource.Bucketed,org.codehaus.jackson.map.annotate.JsonDeserialize,javax.persistence.DiscriminatorColumn,com.trgr.cobalt.dataroom.authorization.secure.Secured,org.hibernate.annotations.GenericGenerator,javax.annotation.Resource,com.trgr.cobalt.infrastructure.spring.domain.DomainField,org.codehaus.jackson.annotate.JsonAutoDetect,javax.persistence.DiscriminatorValue,com.trgr.cobalt.dataroom.datasource.config.core.CoreTransactionMandatory,org.springframework.stereotype.Repository,javax.persistence.GeneratedValue,com.trgr.cobalt.dataroom.datasource.config.core.CoreTransactional,org.hibernate.annotations.Cascade,javax.persistence.Table,javax.persistence.Enumerated,org.hibernate.annotations.FilterDef,javax.persistence.OneToOne,com.trgr.cobalt.dataroom.datasource.config.core.CoreEntity,org.springframework.transaction.annotation.Transactional,com.trgr.cobalt.infrastructure.util.enums.EnumConversion,org.springframework.context.annotation.Configuration,com.trgr.cobalt.infrastructure.spring.domain.UpdatedFields,com.trgr.cobalt.infrastructure.spring.documentation.SampleValue,org.springframework.context.annotation.Bean,org.codehaus.jackson.annotate.JsonProperty,javax.persistence.Basic,org.codehaus.jackson.map.annotate.JsonSerialize,com.trgr.cobalt.infrastructure.spring.validation.Required,com.trgr.cobalt.dataroom.datasource.config.core.CoreTransactionNever,org.springframework.context.annotation.Profile,com.trgr.cobalt.infrastructure.spring.stereotype.Persistor,javax.persistence.Transient,com.trgr.cobalt.infrastructure.spring.validation.NotNull,javax.validation.constraints.Size,javax.persistence.Entity,javax.persistence.PrimaryKeyJoinColumn,org.hibernate.annotations.BatchSize,org.springframework.stereotype.Service,org.springframework.beans.factory.annotation.Value,javax.persistence.Inheritance
[javac] error: warnings found and -Werror specified
Run Code Online (Sandbox Code Playgroud)

TIA!

migration hibernate-annotations java-7

5
推荐指数
1
解决办法
1964
查看次数