我必须在遗留数据库中应用JPA,设计很糟糕.不幸的是不可能改变它.幸运的是只能进行只读访问.
我发现的一个最奇怪的事情是没有连接(或中间)表的"多对多"关系.这是表结构的简化:
USER ACCESS
---- ------
ID int primary key ID int primary key
NAME varchar2(20) NAME varchar2(20)
ACCESS_GROUP int ACCESS_GROUP int
Run Code Online (Sandbox Code Playgroud)
"从概念上讲"这个表必须以这种方式用Java类映射:
public class User {
private Integer id;
private String name;
@ManyToMany private List<Access> accessList;
}
public class Access {
private Integer id;
private String name;
@ManyToMany private List<User> userList;
}
Run Code Online (Sandbox Code Playgroud)
但我认为这是不可能的.您认为在JPA中访问此表并浏览它们的最佳方法是什么?
我已经创建了一个自定义数据类型来存储有效和规范化的电子邮件地址:
public class Email implements Serializable {
private final String value;
public Email(String emailAddress) {
this.value = normalize(emailAddress);
if (!isValid(value)) {
throw new IllegalArgumentException("Email address format is not valid: " + value);
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
其对应的JPA 2.1转换器用于自动存储和从数据库检索:
@Converter(autoApply = true)
public class EmailConverter implements AttributeConverter<Email, String> {
@Override
public String convertToDatabaseColumn(Email email) {
return email == null ? null : email.toString();
}
@Override
public Email convertToEntityAttribute(String email) {
return email == null ? null : new Email(email);
}
} …Run Code Online (Sandbox Code Playgroud) 我有这两个接口和类:
public interface Identifiable<T> {
T getId();
}
public interface GenericRepository<T extends Identifiable<K>, K> {
T get(K id);
}
public class MyEntity implements Identifiable<Long> {
private Long id;
public Long getId() {
return id;
}
}
public class MyService {
private GenericRepository<MyEntity, Long> myEntityRepository;
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.但在我看来,GenericRepository(K)中的第二个泛型参数是多余的.因为我知道MyEntity是一个可识别的,我认为如果我最终能像这样使用它会很棒:
public class MyService {
private GenericRepository<MyEntity> myEntityRepository;
}
Run Code Online (Sandbox Code Playgroud)
但是我没有成功就尝试了不同的事情.可能吗?如果没有,为什么不呢?
更新:回答一些回复.我认为编译器知道MyEntity中哪种类型是通用的.例如:
public class MyEntityGenericRepository implements GenericRepository<MyEntity, Long> {
// compiles...
}
public class MyEntityGenericRepository implements GenericRepository<MyEntity, String> {
// compiler says: "Bound mismatch: The …Run Code Online (Sandbox Code Playgroud) 我们正在开发一个连接到遗留数据库的应用程序.这是非常"无类型",几乎所有数据都使用字符串.更糟糕的是,这是非常均匀的:它使用不同的日期或时间模式('YYDDMM','HHMMSS',毫秒)和布尔值('Y'/'N','X'/''),例.
我们想要使用JPA(EclipseLink)和自定义转换器.问题是@Convert期望一个类实现AttributeConverter,所以我们必须为每个模式做新的类.我想要的是一个BooleanConverter类,可以使用值'Y'/'N'或'X'/'来实例化.
这显然超出了JPA规范,但也许可以使用EclipseLink注释/配置.查看其@Convert注释,可以按名称指定转换器.如果我可以注册一个ynBooleanConverter并且xSpaceBooleanConverter:
// Unfortunately, this method does not exist :(
Session.addConverter('ynBooleanConverter', new BooleanConverter("Y", "N"));
@Entity
public class MyEntity {
@Convert("ynBooleanConverter")
private Boolean myBoolean;
...
}
Run Code Online (Sandbox Code Playgroud)
可能吗?我们还有其他选择吗?
我习惯用Java开发Web应用程序(Struts,Spring,JSP ......).但现在我想开发一个桌面版.我从不喜欢用Java设计窗口(AWT,Swing,SWT):对于丑陋的界面来说太多了.所以我认为如果可以利用我的网络应用程序技能可能是一个好主意.一种选择是修改SWT浏览器并调用Java函数而不是HTTP请求.一个非常好的附加组件将是JSP的使用.最后,我认为可能有一些框架或工具.
你认为我的建议是个好主意吗?有一些框架吗?
我需要这个用于轻型应用.所以我认为嵌入一个Tomcat服务器并将其与HTTP请求一起使用并不是一个好主意.
谢谢你的帮助.
编辑:一个示例应用程序可能是文件夹比较器:您指定两个文件夹,应用程序显示您的文件夹和文件是不同的.在这种情况下,我认为打开外部浏览器很难看.膨胀的应用程序(使用其服务器,MVC等)不是最佳选择.
在我的应用程序中,Spring管理数据库访问的连接池.Hibernate使用这些连接进行查询.乍一看,我对池没有任何问题:它可以与并发客户端和只有一个连接的池一起正常工作.我可以执行很多查询,所以我认为我(或Spring)不会留下开放的连接.
我的问题在一段时间不活动后出现(有时30分钟,有时超过2小时).然后,当Hibernate进行一些搜索时,它会持续太多.将log4j级别设置为TRACE,我得到这个日志:
...
18:27:01 DEBUG nsactionSynchronizationManager - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@99abd7] for key [org.hibernate.impl.SessionFactoryImpl@7d2897] bound to thread [http-8080-Processor24]
18:27:01 DEBUG HibernateTransactionManager - Found thread-bound Session [org.hibernate.impl.SessionImpl@8878cd] for Hibernate transaction
18:27:01 DEBUG HibernateTransactionManager - Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@1b2ffee]
18:27:01 DEBUG HibernateTransactionManager - Creating new transaction with name [com.acjoventut.service.GenericManager.findByExample]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
18:27:01 DEBUG HibernateTransactionManager - Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@8878cd]
18:27:01 TRACE SessionImpl - setting flush mode to: AUTO
18:27:01 DEBUG JDBCTransaction - begin
18:27:01 DEBUG ConnectionManager - opening JDBC connection
Run Code Online (Sandbox Code Playgroud)
在这里冻结约2-10分钟.但接着继续: …
我有一个包含三列的表格,其中我试图让一些长段落动态地从第一列流入第二列然后再流入第三列.目前,当第一列溢出而不是移动到第二列时,该表将在下一页继续,因此我得到几个页面只填充了一列的数据.我怎样才能解决这个问题?
我想坚持一个拥有一些资源(内联或附件)的邮件实体.首先,我将它们视为双向关系:
@Entity
public class Mail extends BaseEntity {
@OneToMany(mappedBy = "mail", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MailResource> resource;
private String receiver;
private String subject;
private String body;
@Temporal(TemporalType.TIMESTAMP)
private Date queued;
@Temporal(TemporalType.TIMESTAMP)
private Date sent;
public Mail(String receiver, String subject, String body) {
this.receiver = receiver;
this.subject = subject;
this.body = body;
this.queued = new Date();
this.resource = new ArrayList<>();
}
public void addResource(String name, MailResourceType type, byte[] content) {
resource.add(new MailResource(this, name, type, content));
}
}
@Entity …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring MVC <mvc:annotation-driven />
我已经实现了我自己的映射处理程序扩展DefaultAnnotationHandlerMapping,但我不知道如何使用它.我已经宣布这样:
<bean class="es.kcsolutions.boulevard.DispatcherMappingHandler" />
Run Code Online (Sandbox Code Playgroud)
它可以工作,但很明显,DefaultAnnotationHandlerMapping也可以在我之前工作.有没有办法禁用它并只使用我的?
谢谢.
我正在使用Lucene 3.0.3.我已经制作了一个Spring bean,旨在将所有操作封装在同一个索引上.
public class IndexOperations {
private IndexWriter writer;
private IndexReader reader;
private IndexSearcher searcher;
public void init() {...}
public void destroy() {...}
public void save(Document d) {...}
public void delete(Document d) {...}
public List<Document> list() {...}
}
Run Code Online (Sandbox Code Playgroud)
为了允许快速更改和搜索,我认为让作家,读者和搜索者保持开放可能是一个好主意.但问题是,在重新开放之前,读者不能看到作者的承诺变化.而且这种操作成本很高,因此快速搜索可能不是一个好主意.
这种典型场景的最佳方法是什么?
java ×9
hibernate ×4
jpa ×4
eclipselink ×3
orm ×2
spring ×2
css ×1
frameworks ×1
generics ×1
jdbc ×1
jpa-2.0 ×1
lucene ×1
oracle ×1
performance ×1
querydsl ×1
spring-mvc ×1
sql ×1
swt ×1