我有一个数据访问类,它作为独立的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
在我的实体中,我有一些用于验证的休眠注释,例如 @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?
谢谢。
如果我在超类中只有 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和注释在Spring中设置以下内容.
<property name="hibernate.hbm2ddl.auto" value="update"/>
我应该是可能的,我相信让xml项目免费更清洁.
PS:这应该不重要,但我在Heroku上运行它.
java spring hibernate spring-annotations hibernate-annotations
我有一个棘手的事情,我正试图用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) 在实体Vs,Composite Id中使用多个@Id有什么区别?
另外,当没有为嵌入式对象单独创建的表时,这个@EmbeddedId如何工作?
我有以下实体类:
@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和注释为我配置了所有内容.
任何帮助将不胜感激.
谢谢.
我正在使用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
我正在尝试使用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) 我收到以下警告,这似乎是触发后续警告和错误.我一直在谷歌搜索疯狂,但没有找到任何清楚说明我应该做什么来解决这个问题.执行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!