??xml version="1.0" encoding="utf-8" standalone="yes"?>国产白浆在线免费观看,亚洲一区二区毛片,国产精品91xxx http://www.aygfsteel.com/rain1102/category/37639.html<br/><font color="green" style="font-family: 华文行楷;font-size:16px;">子曰Q危邦不入,乱邦不居。天下有道则见,无道则隐?lt;/font><font color="#3C1435"></font> zh-cn Wed, 11 Nov 2009 17:25:44 GMT Wed, 11 Nov 2009 17:25:44 GMT 60 Hibernate中主键增长步长ؓ(f)50的问?Oracle http://www.aygfsteel.com/rain1102/archive/2009/11/11/302019.htmlEric.Zhou Eric.Zhou Wed, 11 Nov 2009 13:54:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/11/11/302019.html http://www.aygfsteel.com/rain1102/comments/302019.html http://www.aygfsteel.com/rain1102/archive/2009/11/11/302019.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/302019.html http://www.aygfsteel.com/rain1102/services/trackbacks/302019.html 原文地址Qhttp://jhyimu2005.javaeye.com/blog/514379
先声明一下我用的框架是Spring + Hibernate + SpringMVC 数据库用的是Oracle
昨天遇到?jin)一个特诡异的问题就是我使用Oracle序列Q把主键的计ClHibernate处理Q?
Entity
@Table(name = "BIO_STUDY")
public class Study implements Serializable{
private static final long serialVersionUID = -5932941248053882057L;
private int id;
private Project project;
private String name;
private String description;
private Set<Experiment> experiments;
@Id
@Column(name = "ID")
@SequenceGenerator(name = "BIO_STUDY_SQ",
sequenceName = "BIO_STUDY_SQ" )
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BIO_STUDY_SQ")
public int getId() {
return id;
}
写完部v什么都没问题,可当我写?jin)测试类q行试时发C键的初始值竟然是50Q其步长亦是50Q在同事的帮助下发现原来是Hibernate在做|@SequenceGenerator中添加两个参?span style="color: red">QallocationSize = 1, initialValue = 1Q?/span>O(jin)K。通过查找Hibernate的资料发现原来是因ؓ(f)allocationSize的默认值是50.具体请参考http://www.oracle.com/technology/global/cn/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#SequenceGenerator
只需要增加allocationSize = 1可?/span>
]]> AbstractTransactionalJUnit4SpringContextTests中的事务回滚 http://www.aygfsteel.com/rain1102/archive/2009/11/04/301147.htmlEric.Zhou Eric.Zhou Wed, 04 Nov 2009 12:58:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/11/04/301147.html http://www.aygfsteel.com/rain1102/comments/301147.html http://www.aygfsteel.com/rain1102/archive/2009/11/04/301147.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/301147.html http://www.aygfsteel.com/rain1102/services/trackbacks/301147.html
当前有一个User和一个RoleQ它们是多对多关p,中间表ؓ(f)user_role存放user和role的id。部分User代码如下Q?br />
@ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)
@JoinTable(name = "user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
public void addRole(Role role) {
if (!this.roles.contains(role)) {
this.roles.add(role);
}
}
public void removeRole(Role role) {
this.roles.remove(role);
}
Role中的部分代码如下Q?br />
@ManyToMany(
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
mappedBy = "roles",
targetEntity = User.class
)
public Set<User> getUsers() {
return users;
}
而测试代码承了(jin)AbstractTransactionalJUnit4SpringContextTestsQ代码如下:(x)
@Test
public void testManyToMany() {
Role oneRole = new Role();
oneRole.setDescription("manager");
oneRole.setEnabled(true);
oneRole.setRoleName("manger");
Role twoRole = new Role();
twoRole.setDescription("waitress");
twoRole.setEnabled(true);
twoRole.setRoleName("waitress");
User user = new User();
user.setEnabled(true);
user.setPassword("jianghaiying");
user.setUsername("Jiang HaiYing");
user.addRole(oneRole);
user.addRole(twoRole);
userDAO.persist(user);
try {
userDAO.getConnection().commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
q样执行以后Q打印出的信息如下:(x)
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
q时候问题出来了(jin)Qؓ(f)什么没有往关系表中插入数据Q?br />
其实qƈ不是代码或者配|写错误?jin),在正式运行代码一切正常,而是AbstractTransactionalJUnit4SpringContextTests出的|事实上多对多兌关系是由Hibernated我们l护的,而AbstractTransactionalJUnit4SpringContextTestsZ(jin)保持数据的清z又?x)自动回滚。如何解册个问题呢Q?br />
Ҏ(gu)Q?br />
只需要在testҎ(gu)上添?span style="color: #008000">@Rollback(false)Q?/span>不让它回滚,一切正怺(jin)。这时候也可以Ltry语句?jin)?br />
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into user_role (user_id, role_id) values (?, ?)
Hibernate: insert into user_role (user_id, role_id) values (?, ?) ]]> Hibernate 参数讄一览表[转蝲] http://www.aygfsteel.com/rain1102/archive/2009/06/12/281873.htmlEric.Zhou Eric.Zhou Fri, 12 Jun 2009 09:02:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/06/12/281873.html http://www.aygfsteel.com/rain1102/comments/281873.html http://www.aygfsteel.com/rain1102/archive/2009/06/12/281873.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/281873.html http://www.aygfsteel.com/rain1102/services/trackbacks/281873.html 属性名 用?nbsp;
hibernate.dialect 一个Hibernate Dialectcd允许Hibernate针对特定的关pL据库生成优化的SQL. 取值full.classname.of.Dialect
hibernate.show_sql 输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQLq个log category设ؓ(f)debug?eg.true | false
hibernate.format_sql 在log和console中打印出更漂亮的SQL?取值true | false
hibernate.default_schema 在生成的SQL? 给定的schema/tablespace附加于非全限定名的表名上. 取值SCHEMA_NAME
hibernate.default_catalog 在生成的SQL? 给定的catalog附加于非全限定名的表名上. 取值CATALOG_NAME
hibernate.session_factory_name SessionFactory 创徏后,自动用这个名字绑定到JNDI? 取值jndi/composite/name
hibernate.max_fetch_depth 为单向关?一对一, 多对一)的外q接抓取Qouter join fetchQ树(wi)讄最大深? gؓ(f)0意味着关闭默认的外连接抓? 取???之间取?nbsp;
hibernate.default_batch_fetch_size 为Hibernate兌的批量抓取设|默认数? 取?的取gؓ(f)4, 8, ?6
hibernate.default_entity_mode 为由q个SessionFactory打开的所有Session指定默认的实体表现模? 取值dynamic-map, dom4j, pojo
hibernate.order_updates 强制Hibernate按照被更新数据的主键Qؓ(f)SQL更新排序。这么做减在高ƈ发系l中事务的死锁?取值true | false
hibernate.generate_statistics 如果开? Hibernate收集有助于性能调节的统计数? 取值true | false
hibernate.use_identifer_rollback 如果开? 在对象被删除时生成的标识属性将被重设ؓ(f)默认? 取值true | false
hibernate.use_sql_comments 如果开? Hibernate在SQL中生成有助于调试的注释信? 默认gؓ(f)false. 取值true | false
?3.4. Hibernate JDBC和连?connection)属?/p>
属性名 用?nbsp;
hibernate.jdbc.fetch_size 非零|指定JDBC抓取数量的大?(调用Statement.setFetchSize()).
hibernate.jdbc.batch_size 非零|允许Hibernate使用JDBC2的批量更? 取???0之间的?nbsp;
hibernate.jdbc.batch_versioned_data 如果你想让你的JDBC驱动从executeBatch()q回正确的行计数 , 那么此属性设为true(开启这个选项通常是安全的). 同时QHibernateؓ(f)自动版本化的数据使用扚wDML. 默认gؓ(f)false. eg.true | false
hibernate.jdbc.factory_class 选择一个自定义的Batcher. 多数应用E序不需要这个配|属? eg.classname.of.Batcher
hibernate.jdbc.use_scrollable_resultset 允许Hibernate使用JDBC2的可滚动l果? 只有在用用h供的JDBCq接Ӟq个选项才是必要? 否则Hibernate?x)用连接的元数? 取值true | false
hibernate.jdbc.use_streams_for_binary 在JDBCdbinary (二进?或serializable (可序列化) 的类型时使用?stream)(pȝU属?. 取值true | false
hibernate.jdbc.use_get_generated_keys 在数据插入数据库之后Q允怋用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(?。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器旉到问题,请将此D为false. 默认情况下将使用q接的元数据来判定驱动的能力. 取值true|false
hibernate.connection.provider_class 自定义ConnectionProvider的类? 此类用来向Hibernate提供JDBCq接. 取值classname.of.ConnectionProvider
hibernate.connection.isolation 讄JDBC事务隔离U别. 查看java.sql.Connection来了(jin)解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离U别. 取?, 2, 4, 8
hibernate.connection.autocommit 允许被缓存的JDBCq接开启自动提?autocommit) (不徏?. 取值true | false
hibernate.connection.release_mode 指定Hibernate在何旉放JDBCq接. 默认情况?直到Session被显式关闭或被断开q接?才会(x)释放JDBCq接. 对于应用E序服务器的JTA数据? 你应当用after_statement, q样在每ơJDBC调用后,都会(x)d的释放连? 对于非JTA的连? 使用after_transaction在每个事务结束时释放q接是合理的. autoؓ(f)JTA和CMT事务{略选择after_statement, 为JDBC事务{略选择after_transaction. 取值o(j)n_close | after_transaction | after_statement | auto
hibernate.connection.<propertyName> JDBC属性propertyName传递到DriverManager.getConnection()中去.
hibernate.jndi.<propertyName> 属性propertyName传递到JNDI InitialContextFactory中去.
?3.5. Hibernate~存属?/p>
属性名 用?nbsp;
hibernate.cache.provider_class 自定义的CacheProvider的类? 取值classname.of.CacheProvider
hibernate.cache.use_minimal_puts 以频J的L作ؓ(f)代h(hun), 优化二~存来最化写操? 在Hibernate3中,q个讄对的集群~存非常有用, 寚w缓存的实现而言Q默认是开启的. 取值true|false
hibernate.cache.use_query_cache 允许查询~存, 个别查询仍然需要被讄为可~存? 取值true|false
hibernate.cache.use_second_level_cache 能用来完全禁止用二U缓? 寚w些在cȝ映射定义中指?lt;cache>的类Q会(x)默认开启二U缓? 取值true|false
hibernate.cache.query_cache_factory 自定义实现QueryCache接口的类? 默认为内建的StandardQueryCache. 取值classname.of.QueryCache
hibernate.cache.region_prefix 二~存区域名的前缀. 取值prefix
hibernate.cache.use_structured_entries 强制Hibernate以更人性化的格式将数据存入二~存. 取值true|false
?3.6. Hibernate事务属?/p>
属性名 用?nbsp;
hibernate.transaction.factory_class 一个TransactionFactory的类? 用于Hibernate Transaction API (默认为JDBCTransactionFactory). 取值classname.of.TransactionFactory
jta.UserTransaction 一个JNDI名字Q被JTATransactionFactory用来从应用服务器获取JTA UserTransaction. 取值jndi/composite/name
hibernate.transaction.manager_lookup_class 一个TransactionManagerLookup的类?- 当用JVMU缓存,或在JTA环境中用hilo生成器的时候需要该c? 取值classname.of.TransactionManagerLookup
hibernate.transaction.flush_before_completion 如果开? session在事务完成后被自动清洗(flush)?现在更好的方法是使用自动session上下文管理。取值true | false
hibernate.transaction.auto_close_session 如果开? session在事务完成后被自动关闭?现在更好的方法是使用自动session上下文管理。取值true | false
?3.7. 其他属?/p>
属性名 用?nbsp;
hibernate.current_session_context_class ?当前" Session指定一?自定义的){略。eg.jta | thread | custom.Class
hibernate.query.factory_class 选择HQL解析器的实现. 取值o(j)rg.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.query.substitutions Hibernate查询中的W号映射到SQL查询中的W号 (W号可能是函数名或常量名?. 取值hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
hibernate.hbm2ddl.auto 在SessionFactory创徏Ӟ自动(g)查数据库l构Q或者将数据库schema的DDL导出到数据库. 使用 create-drop?在显式关闭SessionFactoryӞdrop掉数据库schema. 取值validate | update | create | create-drop
hibernate.cglib.use_reflection_optimizer 开启CGLIB来替代运行时反射机制(pȝU属?. 反射机制有时在除错时比较有用. 注意即关闭q个优化, Hibernateq是需要CGLIB. 你不能在hibernate.cfg.xml中设|此属? 取值true | false
3.4.1. SQL方言 你应当LZ的数据库hibernate.dialect属性设|成正确?org.hibernate.dialect.Dialect子类. 如果你指定一U方a, Hibernateؓ(f)上面列出的一些属性用合理的默认? Z省去?jin)手工指定它们的功?
?3.8. Hibernate SQL方言 (hibernate.dialect)
RDBMS 方言
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect
?3.9. Hibernate日志cd
cd 功能
org.hibernate.SQL 在所有SQL DML语句被执行时为它们记录日?nbsp;
org.hibernate.type 为所有JDBC参数记录日志
org.hibernate.tool.hbm2ddl 在所有SQL DDL语句执行时ؓ(f)它们记录日志
org.hibernate.pretty 在session清洗(flush)Ӟ为所有与其关联的实体(最?0?的状态记录日?nbsp;
org.hibernate.cache 为所有二U缓存的zd记录日志
org.hibernate.transaction Z务相关的zd记录日志
org.hibernate.jdbc 为所有JDBC资源的获取记录日?nbsp;
org.hibernate.hql.AST 在解析查询的时?记录HQL和SQL的AST分析日志
org.hibernate.secure 为JAAS认证h做日?nbsp;
org.hibernate ZQ何Hibernate相关信息做日?(信息量较? 但对查错非常有帮?
?3.10. JTA TransactionManagers
Transaction工厂c?nbsp; 应用E序服务?nbsp;
org.hibernate.transaction.JBossTransactionManagerLookup JBoss
org.hibernate.transaction.WeblogicTransactionManagerLookup Weblogic
org.hibernate.transaction.WebSphereTransactionManagerLookup WebSphere
org.hibernate.transaction.WebSphereExtendedJTATransactionLookup WebSphere 6
org.hibernate.transaction.OrionTransactionManagerLookup Orion
org.hibernate.transaction.ResinTransactionManagerLookup Resin
org.hibernate.transaction.JOTMTransactionManagerLookup JOTM
org.hibernate.transaction.JOnASTransactionManagerLookup JOnAS
org.hibernate.transaction.JRun4TransactionManagerLookup JRun4
org.hibernate.transaction.BESTransactionManagerLookup Borland ES
]]>Hibernate中的回调与拦截机制[转蝲] http://www.aygfsteel.com/rain1102/archive/2009/06/11/281513.htmlEric.Zhou Eric.Zhou Thu, 11 Jun 2009 08:49:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/06/11/281513.html http://www.aygfsteel.com/rain1102/comments/281513.html http://www.aygfsteel.com/rain1102/archive/2009/06/11/281513.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/281513.html http://www.aygfsteel.com/rain1102/services/trackbacks/281513.html 操作q行捕获q执行一些操作,q可以通过数据库触发器来实玎ͼ但是正如我们上一节中所分析的,׃触发器的执行?/span>Hibernate Session提供?jin)一些专门用于捕L(fng)听实?/span>CURD操作时捕获事Ӟq且执行相应的动作逻辑。在 Hibernate下面我们分别讲解怎样通过q些接口Q实现回调拦截的技术细节?/span>
A?/span>Validatable
?/span>Lifecycle在实体对象执?/span>save/insert?/span>session.update()在实体对象执?/span>delete在实体对象加载之后触?/span>
**/
public void onLoad(Session session) throws CallbackException;
}
接口Q来获得在持久化阶段捕获 CURD……
return false;
……
return true;
……
return false;
……
}
}
Ҏ(gu)Q如果返?/span>trueQ对应的操作也会(x)被终止?/span>
参数执行持久化操作,在这些方法中 Session部分详细讲解?/span>
Hibernate接口Q该接口定义如下Q?/span>
public interface Validatable{
public void validate() throws ValidationFailure;
}
Validatable接口Qƈ在接口的 validateҎ(gu)会(x)在实体对象持久化前得到调用进行数据验证,?/span>LifecycleҎ(gu)在实体生命周期中可能被多ơ调用,因此此方法应该仅限于数据合法性的验证Q而不应该实现业务逻辑的验证?/span>
B以上?/span>Hibernate接口?/span>Validatable原生接口Q这׃代码的可UL性大大下降,因ؓ(f)此时实体cdl不再是一?/span>POJO的那些天才的设计者们也已l意识到?jin)这个问题,所以又提供?/span>Interceptor接口通过讄注入来实现持久化事g的捕获和处理Q这是典型的 IOC接口的技术细节和使用Ҏ(gu)?/span>
Hibernate接口定义如下Q?/span>
public interface Interceptor{
//如果在这个方法中修改?jin)实体对象的数据Q那么返?/span>true在进行脏数据?hu)(g)查时Q如果发现实体对象数据已脏,p用此Ҏ(gu)
public boolean onFlushDirty(Object entity,Serializable id,Object[] state,
String[] propertyNames,Type[] types) throws CallbackException;
//Q否则返?/span>null.
public boolean onSave(Object entity,Serializable id,Object[] state,
String[] propertyNames,Type[] types) throws CallbackException;
//删除一个实体对象前调用
public boolean onDelete(Object entity,Serializable id,Object[] state,
String[] propertyNames,Type[] types) throws CallbackException;
//Session之前调用
public boolean preFlush(Iterator entities) throws CallbackException;
//Session之后Q所有的 SQL当执?/span>saveOrUpdate执行 Session.flush()?/span>Session?x)按照默认方式构造实体类对象实例
public Object findDirty(Class clazz,Serializable id) throws CallbackException;
}
Intercepter接口的类Q然后在创徏 Hibernate Session对象讄q所创徏?/span>Session来操作的实体对象Q就都会(x)hҎ(gu)久化动作的回调拦截能力。在 Hibernate对象共有两种用法Q如下所qͼ(x)
1Qؓ(f)每个 SessionQ这个拦截接口对象,存放?/span>Session实例所专用?/span>
2?/span>SessionFactory实例Q这?/span>Interceptor范围内,被每?/span>Session?/span>Interceptor下面我实C个利?/span>Interceptor首先定义用于记录操作的实体:(x)
public class AudiLog implements Serializable{
private String id;
private String user;
private String action;
private String entityName;
private String comment;
private Long logtime;
…getter/setter…
}
接口的实现类和用于持久化操作?/span>AuditDAOJava.io.Serializable;
import net.sf.hibernate.type.Type;
import net.sf.hibernate.HibernateException;
import Java .util.Iterator;
import Java .util.Set;
import Java .util.HashSet;
import com.neusoft.entity.User;
public class MyInterceptor implements Interceptor{
private Set insertset=new HashSet();
private Set updateset=new HashSet();
private Session session;
private String userID;
public void setSession(Session session){
this.session=session
public void setUserID(String id){
this.userID=id;
}
public boolean onLoad(Object object, Serializable serializable,
Object[] objectArray, String[] stringArray,
Type[] typeArray) {
return false;
}
public boolean onFlushDirty(Object object, Serializable serializable,
Object[] objectArray, Object[] objectArray3,
String[] stringArray, Type[] typeArray) {
if(object instanceof User){
insertset.add(object);
}
return false;
}
public boolean onSave(Object object, Serializable serializable,
Object[] objectArray, String[] stringArray,
Type[] typeArray) {
if(object instanceof User){
updateset.add(object);
}
return false;
}
public void onDelete(Object object, Serializable serializable,
Object[] objectArray, String[] stringArray,
Type[] typeArray) {
}
public void preFlush(Iterator iterator) {
}
public void postFlush(Iterator iterator) {
try{
if(insertset.size()>0){
AuditDAO.dolog(“insert”,userID,inserset,session.connection);
}
if(updateset.size()>0){
AuditDAO.dolog(“update”,userID,updateset,session.connection);
}
}catch(HibernateException he){
he.printStackTrace();
}
}
public Boolean isUnsaved(Object object) {
return null;
}
public int[] findDirty(Object object, Serializable serializable,
Object[] objectArray, Object[] objectArray3,
String[] stringArray, Type[] typeArray) {
return null;
}
public Object instantiate(Class class0, Serializable serializable) {
return "";
}
}
public class AuditDAO{
public static void doLog(String action,String userID,Set modifySet,Connection connection){
Session tempsession=HibernateUtil.getSessionFactory().openSession(connection);
try{
Iterator it=modifyset.iterator();
while(it.hasNext()){
User user=(User)it.next();
AudiLog log=new AudiLog();
log.setUserID(userID);
log.setAction(action);
log.setComment(user.toString());
log.setLogTime(new Long(Calendar.getInstance().getTime().getTime()));
tempsession.save(log);
}
}catch(Exception e){
throw new CallbackException(e);
}finally{
try{
tempsesson.close();
}catch(HibernateException he){
throw new CallbackException(he);
}
}
}
}
以上CZ代码中,在创?/span>Session Interceptor session.save(user) onSave() tx.commit() flush() postFlush() AuditDAO Session Session Session JDBC Connection Session Session JDBC Connection Interceptor Session , Session JDBC Connection Interceptor ]]>
Interceptor中onFlushDirtyҎ(gu)的参数previousState一直是I?/title> http://www.aygfsteel.com/rain1102/archive/2009/06/05/280270.htmlEric.Zhou Eric.Zhou Fri, 05 Jun 2009 12:58:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/06/05/280270.html http://www.aygfsteel.com/rain1102/comments/280270.html http://www.aygfsteel.com/rain1102/archive/2009/06/05/280270.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/280270.html http://www.aygfsteel.com/rain1102/services/trackbacks/280270.html ]]> Hibernate ?Spring 多数据源的配|【{载?/title> http://www.aygfsteel.com/rain1102/archive/2009/03/09/258670.htmlEric.Zhou Eric.Zhou Mon, 09 Mar 2009 13:06:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/03/09/258670.html http://www.aygfsteel.com/rain1102/comments/258670.html http://www.aygfsteel.com/rain1102/archive/2009/03/09/258670.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/258670.html http://www.aygfsteel.com/rain1102/services/trackbacks/258670.html Spring2.0.1以后的版本已l支持配|多数据源,q且可以在运行的时候动态加载不同的数据源。通过l承AbstractRoutingDataSource可以实现多数据源的动态{换。目前做的项目就是需要访?2个数据源Q每个数据源的表l构都是相同的,所以要求数据源的变动对于编码h员来说是透明Q也是说同样SQL语句在不同的环境下操作的数据库是不一L(fng)。具体的配置如下Q?
一、首先需要写一个静(rn)态的键值对照类Q?/p>
代码
package cn.com.xinli.ccp.dynamicds;
public class DataSourceMap {
public static final String Admin= "Admin" ;
public static final String Yxh = "Yxh" ;
}
q个cM要在使用的时候当作获得数据源的标志用?
二、徏立一个获得和讄上下文的c:(x)
代码
package cn.com.xinli.ccp.dynamicds;
public class CustomerContextHolder {
private static final ThreadLocal contextHolder =
new ThreadLocal();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
return (String) contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
}
q个主要负责讄上下文环境和获得上下文环境?
三、徏立动态数据源c,q个cdȝ承AbstractRoutingDataSourceQ?
代码
package cn.com.xinli.ccp.dynamicds;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
return CustomerContextHolder.getCustomerType();
}
}
q个cdC(jin)determineCurrentLookupKeyҎ(gu)Q该Ҏ(gu)q回一个ObjectQ一般是q回字符Ԍ也可以是枚Dcd。该Ҏ(gu)中直接用了(jin)CustomerContextHolder.getCustomerType()Ҏ(gu)获得上下文环境ƈ直接q回?
四、编写spring的配|文仉|数据源
代码
< bean id = "parentDataSource"
class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >
< property name = "driverClassName" >
< value > COM.ibm.db2.jdbc.net.DB2Driver </ value >
</ property >
< property name = "url" >
< value > jdbc:db2:127.0.0.1:TEST </ value >
</ property >
</ bean >
< bean id = "adminDataSource" parent = "parentDataSource" >
< property name = "username" value = "admin" />
< property name = "password" value = "master997mb" />
</ bean >
< bean id = "yxhDataSource" parent = "parentDataSource" >
< property name = "username" value = "yxh" />
< property name = "password" value = "yxh" />
</ bean >
在这个配|中可以看到首先有个parentDataSourceQ这个主要配|一些数据源的公用信息,目中都是链接DB2数据库;adminDataSource和yxhDataSource是根据不同需要配|的个性化信息Q但都必dparent属性,gؓ(f)parentDataSource。这样就配置好了(jin)2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库,那么parentDataSource可以不要了(jin)Q直接配|两个不同的数据源链接就可以?jin)?
五、编写spring配置文g配置多数据源映射关系
代码
< bean id = "dataSource" class = "cn.com.xinli.ccp.dynamicds.DynamicDataSource" >
< property name = "targetDataSources" >
< map key-type = "Java .lang.String" >
< entry key = "Yxh" value-ref = "yxhDataSource" />
</ map >
</ property >
< property name = "defaultTargetDataSource" ref = "adminDataSource" />
</ bean >
在这个配|中W一个property属性配|目标数据源Q?lt;map key-type="Java .lang.String">中的key-type必须要和?rn)态键值对照类DataSourceMap中的值的cd相同Q?lt;entry key="Yxh" value-ref="yxhDataSource"/>中key的值必要和静(rn)态键值对照类中的值相同,如果有多个|可以配置多个<entry>标签。第二个property属性配|默认的数据源?
六、配|hibernate?
Hibernate的配|和普通的hibernate、springl合的配|一?
代码
< bean id = "sessionFactory"
class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
<!-- to override, use the "SpringDatasourceConfig" snippet in your project -->
< property name = "dataSource" >
< ref local = "dataSource" />
</ property >
< property name = "mappingResources" >
< list >
< value >
cn/com/xinli/ccp/entity/User.hbm.xml
</ value >
< value >
cn/com/xinli/ccp/entity/Test.hbm.xml
</ value >
</ list >
</ property >
< property name = "hibernateProperties" >
< props >
< prop key = "hibernate.dialect" >
org.hibernate.dialect.DB2Dialect
</ prop >
< prop key = "hibernate.show_sql" > true </ prop >
< prop key = "hibernate.use_outer_join" > true </ prop >
< prop key = "hibernate.jdbc.batch_size" > 50 </ prop >
< prop key = "hibernate.jdbc.fetch_size" > 5 </ prop >
< prop key = "hibernate.connection.pool_size" > 2 </ prop >
< prop key = "hibernate.connection.autocommit" > false </ prop >
< prop key = "hibernate.cache.use_query_cache" > false </ prop >
< prop key = "hibernate.max_fetch_depth" > 1 </ prop >
< prop key = "hibernate.bytecode.use_reflection_optimizer" > true </ prop >
</ props >
</ property >
</ bean >
< bean id = "mydao" class = "cn.com.xinli.ccp.dao.HibernateBaseDao" >
< property name = "sessionFactory" >
< ref local = "sessionFactory" />
</ property >
</ bean >
关于dao的代码这里就省略?jin)?
七、配|结束,可以使用?jin)?
代码
public class DaoTest extends TestCase {
public void testSave() throws Exception{
CustomerContextHolder.setCustomerType(DataSourceMap.Admin); //讄数据?
//hibernate创徏实体
Test test = new Test();
test.setTest( "22222222" );
mydao.save(test); //使用dao保存实体
CustomerContextHolder.setCustomerType(DataSourceMap.Yxh); //讄为另一个数据源
mydao.save(test); //使用dao保存实体到另一个库?
}
}
在项目中对于~码人员对多数据源的切换可以做成透明的,操作同样的daoQ就可以讉K不同的数据库?jin)?img src ="http://www.aygfsteel.com/rain1102/aggbug/258670.html" width = "1" height = "1" /> ]]> HQL中用in查询 http://www.aygfsteel.com/rain1102/archive/2009/02/27/256987.htmlEric.Zhou Eric.Zhou Fri, 27 Feb 2009 05:10:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/02/27/256987.html http://www.aygfsteel.com/rain1102/comments/256987.html http://www.aygfsteel.com/rain1102/archive/2009/02/27/256987.html#Feedback 2 http://www.aygfsteel.com/rain1102/comments/commentRss/256987.html http://www.aygfsteel.com/rain1102/services/trackbacks/256987.html
structures = (List<ACD1Structure>) structureDAO.createQuery(hql).setParameterList ("ids", cd_ids).list(); ]]> Hibernate的createSQLQuery查询的小例子 http://www.aygfsteel.com/rain1102/archive/2009/02/23/256344.htmlEric.Zhou Eric.Zhou Mon, 23 Feb 2009 13:26:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/02/23/256344.html http://www.aygfsteel.com/rain1102/comments/256344.html http://www.aygfsteel.com/rain1102/archive/2009/02/23/256344.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/256344.html http://www.aygfsteel.com/rain1102/services/trackbacks/256344.html 当我们用HQLq行子查询的时候,如select * from Tree where pid in (select id from TreeQ此时HIBERANTE׃(x)报错Q说什?号错误之cȝ。但如果?改ؓ(f)Treec里的所有子D|׃?x)有问题(sh)(jin)。就?x)像qx(chng)一L(fng)一行数据返回一个Object[]Q然后你再根据Treec里字段对Object[]数组里的D行{换。这样一来比较麻?ch)。今天发现如果我SQL来查有一个方法可以返回一个对象的?
Configuration config = new Configuration().configure();
SessionFactory sf = config.buildSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Query query = session.createSQLQuery("select * from Tree t where pid in (select id from Tree) ").addEntity(Tree.class); // q回对象
List list = query.list();
此时在遍历list时就可以(Tree)list.get[i];每一行的内容变换Z个对象了(jin)?
另还可以q回一个Map对象Q也是说在在list里包含多个MapQ代码如?
Query query = session.createSQLQuery("select id,name from Tree t where pid in (select id from Tree) ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP ); //q回一个map,KEY:为DB中名UC_(d)大小写一_(d)(j) 遍历list时就可以
Map map = (Map)list.get[i];
map.get("id");map.get("name");来取倹{按你的SQL语句select后的字段名来作ؓ(f)map的KeyQ但q个key必须与数据库中的字段名一模一栗?
q可以用作函数方面的。如
Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in (select id from Tree)
.addScalar("SUMID",Hibernate.INTEGER) //转换cdQ按DB中的type?br />
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //q回一个map,KEY:为DB中名UC_(d)大小写一_(d)(j)
直接map.get("SUMID")可以取g(jin)
q有一点就是这个方法在Hibernate3.2版本上才能正常运行?
]]> Hibernate Annotation中BLOB、CLOB注解写法 http://www.aygfsteel.com/rain1102/archive/2009/02/10/254102.htmlEric.Zhou Eric.Zhou Tue, 10 Feb 2009 08:24:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/02/10/254102.html http://www.aygfsteel.com/rain1102/comments/254102.html http://www.aygfsteel.com/rain1102/archive/2009/02/10/254102.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/254102.html http://www.aygfsteel.com/rain1102/services/trackbacks/254102.html ?/span>hibernate Annotation?/span>CLOBcdQ类型声明ؓ(f) byte[]
private byte[] content
注解Q?/span>
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "CONTENT", columnDefinition = "BLOB",nullable=true)
public byte[] getContent() {
return this.content;
}
public void setContent(byte[] content) {
this.content = content;
}
CLOB卛_Q?/span>
private String remark
注解Q?/span>
@Lob
@Basic(fetch = FetchType.EAGER)
@Column(name="REMARK", columnDefinition="CLOB", nullable=true)
public String getRemark() {
return this.remark;
}
public void setRemark(String recvdocRemark) {
this.remark = remark;
}
]]>[转] 常用 JPA annotation 参?/title> http://www.aygfsteel.com/rain1102/archive/2009/02/09/253913.htmlEric.Zhou Eric.Zhou Mon, 09 Feb 2009 07:38:00 GMT http://www.aygfsteel.com/rain1102/archive/2009/02/09/253913.html http://www.aygfsteel.com/rain1102/comments/253913.html http://www.aygfsteel.com/rain1102/archive/2009/02/09/253913.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/253913.html http://www.aygfsteel.com/rain1102/services/trackbacks/253913.html Table
Table用来定义entity主表的nameQcatalogQschema{属性?
元数据属性说明:(x)
· name: 表名
· catalog: 对应关系数据库中的catalog
· schemaQ对应关pL据库中的schema
· UniqueConstraints:定义一个UniqueConstraint数组Q指定需要徏唯一U束的列
@Entity
@Table(name="CUST")
public class Customer { ... }
SecondaryTable
一个entity class可以映射到多表,SecondaryTable用来定义单个从表的名字,主键名字{属性?
元数据属性说明:(x)
· name: 表名
· catalog: 对应关系数据库中的catalog
· schemaQ对应关pL据库中的schema
· pkJoin: 定义一个PrimaryKeyJoinColumn数组Q指定从表的主键?
· UniqueConstraints:定义一个UniqueConstraint数组Q指定需要徏唯一U束的列
下面的代码说明CustomercL到两个表,主表名是CUSTOMERQ从表名是CUST_DETAILQ从表的主键列和主表的主键列cd相同Q列名ؓ(f)CUST_ID?
@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))
public class Customer { ... }
SecondaryTables
当一个entity class映射C个主表和多个从表Ӟ用SecondaryTables来定义各个从表的属性?
元数据属性说明:(x)
· valueQ?定义一个SecondaryTable数组Q指定每个从表的属性?
@Table(name = "CUSTOMER")
@SecondaryTables( value = {
@SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),
@SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })
public class Customer {}
UniqueConstraint
UniqueConstraint定义在Table或SecondaryTable元数据里Q用来指定徏表时需要徏唯一U束的列?
元数据属性说明:(x)
· columnNames:定义一个字W串数组Q指定要建唯一U束的列名?
@Entity
@Table(name="EMPLOYEE",
uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}
)
public class Employee { ... }
Column
Column元数据定义了(jin)映射到数据库的列的所有属性:(x)列名Q是否唯一Q是否允ؓ(f)I,是否允许更新{?
元数据属性说明:(x)
· name:列名?
· unique: 是否唯一
· nullable: 是否允许为空
· insertable: 是否允许插入
· updatable: 是否允许更新
· columnDefinition: 定义时创建此列的DDL
· secondaryTable: 从表名。如果此列不建在主表上(默认建在主表Q,该属性定义该列所在从表的名字?
public class Person {
@Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)
private String name;
@Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")
private byte[] picture;
JoinColumn
如果在entity class的field上定义了(jin)关系Qone2one或one2many{)(j)Q我们通过JoinColumn来定义关pȝ属性。JoinColumn的大部分属性和ColumncM?
元数据属性说明:(x)
· name:列名?
· referencedColumnName:该列指向列的列名Q徏表时该列作ؓ(f)外键列指向关pd一端的指定列)(j)
· unique: 是否唯一
· nullable: 是否允许为空
· insertable: 是否允许插入
· updatable: 是否允许更新
· columnDefinition: 定义时创建此列的DDL
· secondaryTable: 从表名。如果此列不建在主表上(默认建在主表Q,该属性定义该列所在从表的名字?
下面的代码说明Custom和Order是一对一关系。在Order对应的映表Z个名为CUST_ID的列Q该列作为外键指向Custom对应表中名ؓ(f)ID的列?
public class Custom {
@OneToOne
@JoinColumn(
name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)
public Order getOrder() {
return order;
}
JoinColumns
如果在entity class的field上定义了(jin)关系Qone2one或one2many{)(j)Qƈ且关pd在多个JoinColumnQ用JoinColumns定义多个JoinColumn的属性?
元数据属性说明:(x)
· value: 定义JoinColumn数组Q指定每个JoinColumn的属性?
下面的代码说明Custom和Order是一对一关系。在Order对应的映表Z列,一列名为CUST_IDQ该列作为外键指向Custom对应表中名ؓ(f)ID的列,另一列名为CUST_NAMEQ该列作为外键指向Custom对应表中名ؓ(f)NAME的列?
public class Custom {
@OneToOne
@JoinColumns({
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
@JoinColumn(name="CUST_NAME", referencedColumnName="NAME")
})
public Order getOrder() {
return order;
}
Id
声明当前field为映表中的主键列。id值的获取方式有五U:(x)TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCEQSQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的数据库都可以指定为AUTOQ我们会(x)Ҏ(gu)不同数据库做转换。NONE (默认)需要用戯己指定Id的倹{元数据属性说明:(x)
· generate():主键值的获取cd
· generator():TableGenerator的名字(当generate=GeneratorType.TABLE才需要指定该属性)(j)
下面的代码声明Task的主键列id是自动增长的?Oracle和DB2从默认的SEQUENCE取|SQL Server和Sybase该列建成IDENTITYQmysql该列建成auto increment?
@Entity
@Table(name = "OTASK")
public class Task {
@Id(generate = GeneratorType.AUTO)
public Integer getId() {
return id;
}
}
IdClass
当entity class使用复合主键Ӟ需要定义一个类作ؓ(f)id class。id class必须W合以下要求:cdd明ؓ(f)publicQƈ提供一个声明ؓ(f)public的空构造函数。必d现Serializable接,覆写 equals()和hashCodeQ)(j)Ҏ(gu)。entity class的所有id field在id class都要定义Q且cd一栗?
元数据属性说明:(x)
· value: id class的类?
public class EmployeePK implements Java .io.Serializable{
String empName;
Integer empAge;
public EmployeePK(){}
public boolean equals(Object obj){ ......}
public int hashCode(){......}
}
@IdClass(value=com.acme.EmployeePK.class)
@Entity(access=FIELD)
public class Employee {
@Id String empName;
@Id Integer empAge;
}
MapKey
在一对多Q多对多关系中,我们可以用Map来保存集合对象。默认用主键值做keyQ如果用复合主键,则用id class的实例做keyQ如果指定了(jin)name属性,q指定的field的值做key?
元数据属性说明:(x)
· name: 用来做key的field名字
下面的代码说明Person和Book之间是一对多关系。Person的books字段是MapcdQ用Book的isbn字段的g为Map的key?
@Table(name = "PERSON")
public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@MapKey(name = "isbn")
private Map books = new HashMap();
}
OrderBy
在一对多Q多对多关系中,有时我们希望从数据库加蝲出来的集合对象是按一定方式排序的Q这可以通过OrderBy来实玎ͼ默认是按对象的主键升序排列?
元数据属性说明:(x)
· value: 字符串类型,指定排序方式。格式ؓ(f)"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序cd可以不指定,默认是ASC?
下面的代码说明Person和Book之间是一对多关系。集合books按照Book的isbn升序Qname降序排列?
@Table(name = "MAPKEY_PERSON")
public class Person {
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")
@OrderBy(name = "isbn ASC, name DESC")
private List books = new ArrayList();
}
PrimaryKeyJoinColumn
在三U情况下?x)用到PrimaryKeyJoinColumn?
· l承?
· entity class映射C个或多个从表。从表根据主表的主键列(列名为referencedColumnName值的列)(j)Q徏立一个类型一L(fng)主键列,列名由name属性定义?
· one2one关系Q关pȝ护端的主键作为外键指向关p被l护端的主键Q不再新Z个外键列?
元数据属性说明:(x)
· name:列名?
· referencedColumnName:该列引用列的列名
· columnDefinition: 定义时创建此列的DDL
下面的代码说明Customer映射C个表Q主表CUSTOMER,从表CUST_DETAILQ从表需要徏立主键列CUST_IDQ该列和主表的主键列id除了(jin)列名不同Q其他定义一栗?
@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"QreferencedColumnName="id"))
public class Customer {
@Id(generate = GeneratorType.AUTO)
public Integer getId() {
return id;
}
}
下面的代码说明Employee和EmployeeInfo是一对一关系QEmployee的主键列id作ؓ(f)外键指向EmployeeInfo的主键列INFO_ID?
@Table(name = "Employee")
public class Employee {
@OneToOne
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")
EmployeeInfo info;
}
PrimaryKeyJoinColumns
如果entity class使用?jin)复合主键,指定单个PrimaryKeyJoinColumn不能满要求Ӟ可以用PrimaryKeyJoinColumns来定义多个PrimaryKeyJoinColumn?
元数据属性说明:(x)
· value: 一个PrimaryKeyJoinColumn数组Q包含所有PrimaryKeyJoinColumn?
下面的代码说明了(jin)Employee和EmployeeInfo是一对一关系。他们都使用复合主键Q徏表时需要在Employee表徏立一个外键,从Employee的主键列id,name指向EmployeeInfo的主键列INFO_ID和INFO_NAME.
@Entity
@IdClass(EmpPK.class)
@Table(name = "EMPLOYEE")
public class Employee {
private int id;
private String name;
private String address;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),
@PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})
EmployeeInfo info;
}
@Entity
@IdClass(EmpPK.class)
@Table(name = "EMPLOYEE_INFO")
public class EmployeeInfo {
@Id
@Column(name = "INFO_ID")
private int id;
@Id
@Column(name = "INFO_NAME")
private String name;
}
Transient
Transient用来注释entity的属性,指定的这些属性不?x)被持久化,也不会(x)?f)q些属性徏表?
@Transient
private String name;
Version
Version指定实体cd乐观事务中的version属性。在实体c重新由EntityManager理q且加入C观事务中Ӟ保证完整性。每一个类只能有一个属性被指定为versionQversion属性应该映到实体cȝ主表上?
下面的代码说明versionNum属性作个类的versionQ映到数据库中主表的列名是OPTLOCK?
@Version
@Column("OPTLOCK")
protected int getVersionNum() { return versionNum; }
Lob
Lob指定一个属性作为数据库支持的大对象cd在数据库中存储。用LobTypeq个枚D来定义Lob是二q制cdq是字符cd?
LobType枚Dcd说明Q?
· BLOB 二进制大对象QByte[]或者Serializable的类型可以指定ؓ(f)BLOB?
· CLOB 字符型大对象Qchar[]、Character[]或Stringcd可以指定为CLOB?
元数据属性说明:(x)
· fetchQ?定义q个字段是lazy loadedq是eagerly fetched。数据类型是FetchType枚DQ默认ؓ(f)LAZY,即lazy loaded.
· typeQ?定义q个字段在数据库中的JDBC数据cd。数据类型是LobType枚DQ默认ؓ(f)BLOB?
下面的代码定义了(jin)一个BLOBcd的属性和一个CLOBcd的属性?
@Lob
@Column(name="PHOTO" columnDefinition="BLOB NOT NULL")
protected JPEGImage picture;
@Lob(fetch=EAGER, type=CLOB)
@Column(name="REPORT")
protected String report;
JoinTable
JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTableQ用JoinTable的默认倹{?
元数据属性说明:(x)
· table:q个join table的Table定义?
· joinColumns:定义指向所有者主表的外键列,数据cd是JoinColumn数组?
· inverseJoinColumns:定义指向非所有者主表的外键列,数据cd是JoinColumn数组?
下面的代码定义了(jin)一个连接表CUST和PHONE的join table。join table的表名是CUST_PHONEQ包含两个外键,一个外键是CUST_IDQ指向表CUST的主键IDQ另一个外键是PHONE_IDQ指向表PHONE的主键ID?
@JoinTable(
table=@Table(name=CUST_PHONE),
joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")
)
TableGenerator
TableGenerator定义一个主键值生成器Q在Idq个元数据的generateQTABLEӞgenerator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义?
生成器是为多个实体类提供q箋(hu)的ID值的表,每一行ؓ(f)一个类提供ID|ID值通常是整数?
元数据属性说明:(x)
· name:生成器的唯一名字Q可以被I(xin)d元数据用?
· table:生成器用来存储id值的Table定义?
· pkColumnName:生成器表的主键名U?
· valueColumnName:生成器表的ID值的列名U?
· pkColumnValue:生成器表中的一行数据的主键倹{?
· initialValue:id值的初始倹{?
· allocationSize:id值的增量?
下面的代码定义了(jin)两个生成器empGen和addressGenQ生成器的表是ID_GEN?
@Entity public class Employee {
...
@TableGenerator(name="empGen",
table=@Table(name="ID_GEN"),
pkColumnName="GEN_KEY",
valueColumnName="GEN_VALUE",
pkColumnValue="EMP_ID",
allocationSize=1)
@Id(generate=TABLE, generator="empGen")
public int id;
...
}
@Entity public class Address {
...
@TableGenerator(name="addressGen",
table=@Table(name="ID_GEN"),
pkColumnValue="ADDR_ID")
@Id(generate=TABLE, generator="addressGen")
public int id;
...
}
SequenceGenerator
SequenceGenerator定义一个主键值生成器Q在Idq个元数据的generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。生成器是数据库支持的sequence对象?
元数据属性说明:(x)
· name:生成器的唯一名字Q可以被I(xin)d元数据用?
· sequenceName:数据库中Qsequence对象的名U。如果不指定Q会(x)使用提供商指定的默认名称?
· initialValue:id值的初始倹{?
· allocationSize:id值的增量?
下面的代码定义了(jin)一个用提供商默认名称的sequence生成器?
@SequenceGenerator(name="EMP_SEQ", allocationSize=25)
DiscriminatorColumn
DiscriminatorColumn定义在用SINGLE_TABLE或JOINEDl承{略的表中区别不l承层次的列?
元数据属性说明:(x)
· name:column的名字。默认gؓ(f)TYPE?
· columnDefinition:生成DDL的sql片断?
· length:Stringcd的column的长度,其他cd使用默认?0?
下面的代码定义了(jin)一个列名ؓ(f)DISCQ长度ؓ(f)20的Stringcd的区别列?
@Entity
@Table(name="CUST")
@Inheritance(strategy=SINGLE_TABLE,
discriminatorType=STRING,
discriminatorValue="CUSTOMER")
@DiscriminatorColumn(name="DISC", length=20)
public class Customer { ... }
]]> EQL中用case when..then..else..end和exists语句, 以及(qing)True和False http://www.aygfsteel.com/rain1102/archive/2008/08/29/225667.htmlEric.Zhou Eric.Zhou Fri, 29 Aug 2008 15:38:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/08/29/225667.html http://www.aygfsteel.com/rain1102/comments/225667.html http://www.aygfsteel.com/rain1102/archive/2008/08/29/225667.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/225667.html http://www.aygfsteel.com/rain1102/services/trackbacks/225667.html
List<Meeting> meetings = new ArrayList<Meeting>();
meetings = mgr.createQuery("select new com.integral7.ejb3.investigations.Meeting(m.id, m.scheduledDate, m.type.name, m.description, " +
"case when exists (select id from MeetingAudit ma where ma.meeting = m and ma.audit.id = ?0) then True else False end ) " +
" from Meeting m " +
" where m.owner.id = ?1 and m.scheduledDate >= ?2 order by m.scheduledDate asc")
.setParameter(0, candidateId)
.setParameter(1, ownerId)
.setParameter(2, DateUtils.convertToBeginningOfDay(new Date())).getResultList();
return meetings;
}
q里主要注意True ?span style="color: #008000">False 首字母必d写其余小? ]]> HQL语句中的数据cd转换 http://www.aygfsteel.com/rain1102/archive/2008/07/22/216579.htmlEric.Zhou Eric.Zhou Tue, 22 Jul 2008 05:26:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/07/22/216579.html http://www.aygfsteel.com/rain1102/comments/216579.html http://www.aygfsteel.com/rain1102/archive/2008/07/22/216579.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/216579.html http://www.aygfsteel.com/rain1102/services/trackbacks/216579.html 比如我数据库里面使用varchar和对象是使用字符串类? 而实际里面的值都是整? q样需要按照数值来排序, 因ؓ(f)如果按照字符串排?04?x)?a title="Edit Case" > 1020后面.
使用cast(ce.caseID as long) 或者cast(ce.caseID as integer) q要看你的需要了(jin).
注意:long和integer的首字母要小? 不然?x)报I指针异? ]]> 关于hibernate3中enumcd的数据持久化问题 http://www.aygfsteel.com/rain1102/archive/2008/07/01/211915.htmlEric.Zhou Eric.Zhou Tue, 01 Jul 2008 07:26:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/07/01/211915.html http://www.aygfsteel.com/rain1102/comments/211915.html http://www.aygfsteel.com/rain1102/archive/2008/07/01/211915.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/211915.html http://www.aygfsteel.com/rain1102/services/trackbacks/211915.html
寚w要解决的问题的描qͼ(x)
把一?span class="hilite2">enumcd的字D|久化到数据库中,写入到数据库中的gؓ(f)IntegercdQ且有特定的含义Q?br />
我们知道Q如果我们某一个pojo对象的某个属性ؓ(f)enumcd 的话Q在持久化的时候可能会(x)出现如下两种情况:
1、数据库中enum_col的类型ؓ(f)(oracle:number或者sql server:numeric)
@Column(name="enum_col")
public MyEnum getCol(){
return this.col;
}
此种情况下,存到数据库中的数据时col.ordinal()所q回的int数?br />
2、数据库中enum_col的类型ؓ(f)(oracle:varchar2,或者sql serverQvarchar)
@Column(name="enum_col")
public MyEnum getCol(){
return this.col;
}
此种情况下,存储到数据库中的gؓ(f)定义此enum是所使用的名字如Q?br />
public enum MyEnum{
DATA1,
DATA2;
}
则,如果this.col代表DATA1则写DATA1到数据库中去?/pre>
那么我们通过什么样的手D|改变q些呢?如果使用的是hibernate的话可以借助于UserType来实玎ͼ(x)
首先、定义一个enum MyEnumDataQ?在持久化的时候把其code写到数据库中?
package ec.snow.hib.pojos;
public enum MyEnumData{
DATA1("data1",100),
DATA2("data2",200),
DATA3("data3",300);
private String name;
private int code;
public int getCode(){
return this.code;
}
public String getName(){
return this.name;
}
MyEnumData(String name,int code){
this.name = name;
this.code = code;
}
//辅助Ҏ(gu)Q主要在UserType的实C通过相应的code得到MyEnumData
public static MyEnumData formCode(int code){
for(MyEnumData u:MyEnumData.values()){
if(u.getCode()==code)return u;
}
return null;
}
}
//*******************************
接下来、定义相应的UserType的实玎ͼ(x)
package com.snow.hib.pojos;
import Java .io.Serializable;
import Java .sql.PreparedStatement;
import Java .sql.ResultSet;
import Java .sql.SQLException;
import Java .sql.Types;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
/**
*@author anwxAn Weixiao
*@version $Id$
*/
public class MyEnumDataType implements UserType {
public int[] sqlTypes() {
int[] types = {Types.INTEGER};
return types;
}
public Class returnedClass(){
return UserTitle.class;
}
public boolean equals(Object x, Object y) throws HibernateException {
return x == y;
}
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException {
int code = rs.getInt(names[0]);
return rs.wasNull() ? null : MyEnumData.formCode(code);//notice code to use
}
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {
if (value == null) {
st.setNull(index, Types.INTEGER);
} else {
st.setInt(index, ((MyEnumData) value).getCode());
}
}
public Object deepCopy(Object value) throws HibernateException {
return value;
}
public boolean isMutable() {
return false;
}
public Serializable disassemble(Object value) throws HibernateException {
return (Serializable) deepCopy(value);
}
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return deepCopy(cached);
}
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return deepCopy(original);
}
}
//**********************************
最后、通过自定义的UserType来实现对enum的有效持久化
package com.snow.hib.pojos;
import Java .io.Serializable;
import Java x.persistence.Column;
import Java x.persistence.Entity;
import Java x.persistence.Id;
import Java x.persistence.Table;
import org.hibernate.annotations.Type;
/**
*@author anwxAn Weixiao
*@version
*/
@Entity
@Table(name="my_def_type")
public class UseMyEnumData implements Serializable{
private static final long serialVersionUID = 6905822670746966787L;
private String id;
private String username;
private MyEnumData enumData;
@Column(updatable = true,nullable = true,name="MY_TITLE")
@Type(type="com.snow.hib.pojos.MyEnumDataType")
public MyEnumData getEnumData() {
return enumData;
}
public void setEnumData(MyEnumData data) {
this.enumData = data;
}
@Column(updatable=true,nullable = true,name="USER_NAME")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
/**
* @return Returns the id.
*/
@Id
public String getId() {
return id;
}
/**
* @param id The id to set.
*/
public void setId(String id) {
this.id = id;
}
}
下面是测试结果:(x)
//***************************Test result
UseMyEnumData data = new UseMyEnumData();
data.setId("123456");
data.setTitle(MyEnumData.DATA1);
data.setUsername("chsi:manager");
manager.saveUseMyEnumData(title);
则数据库中写入的数据为:(x) [123456 100 chsi:manager]
q有一炚w要注意的是,如果pȝ中用来媄(jing)?span class="hilite2">enumcd的数据可能有出现I值的时候hibernate在处理媄(jing)的时候会(x)
?span class="hilite2">Enumcd影射为null,也就是没有对应的数据Q这在处理旧有系l数据的时候会(x)有用处哦…………
]]> 配置Entity beans为缓?/title> http://www.aygfsteel.com/rain1102/archive/2008/06/13/207622.htmlEric.Zhou Eric.Zhou Fri, 13 Jun 2008 03:55:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/06/13/207622.html http://www.aygfsteel.com/rain1102/comments/207622.html http://www.aygfsteel.com/rain1102/archive/2008/06/13/207622.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/207622.html http://www.aygfsteel.com/rain1102/services/trackbacks/207622.html 你用正常方式定义你的 entity bean cRJBoss EJB 3.0 来的版本将支持 annotating entities 和所~存的它们的关系的集合,但是现在你不得不直接配置底层?hibernate 引擎。让我们看看通过可选的property元素配置 hibernate ~存选项的persistence.xml文g。下面persistence.xml 里的定义~存的元素应该被启用Q?/span>
<!-- Clustered cache with TreeCache -->
< property name ="cache.provider_class" >
org.jboss.ejb3.entity.TreeCacheProviderHook
</ property >
< property name ="treecache.mbean.object_name" >
jboss.cache:service=EJB3EntityTreeCache
</ property >
@Entity
@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)
public class Customer implements Serializable {
// ... ...
}
< server >
< mbean code ="org.jboss.cache.TreeCache"
name ="jboss.cache:service=EJB3EntityTreeCache" >
< depends > jboss:service=Naming
< depends > jboss:service=TransactionManager
... ...
< attribute name ="EvictionPolicyConfig" >
< config >
< attribute name ="wakeUpIntervalSeconds" > 5</ attribute >
< region name ="/_default_" >
< attribute name ="maxNodes" > 5000</ attribute >
< attribute name ="timeToLiveSeconds" > 1000</ attribute >
</ region >
< region name ="/mycompany/Customer" >
< attribute name ="maxNodes" > 10</ attribute >
< attribute name ="timeToLiveSeconds" > 5000</ attribute >
</ region >
... ...
</ config >
</ attribute >
</ mbean >
</ server >
如果你没有ؓ(f) entity bean cL定缓存区Qcache regionQ,q个cȝ所有实例将象上面定义的一L(fng)存在/_default区里。EJB3 Query API 提供?jin)让你在指定的缓存区里保存或载入查询l果Q就?entity beans 的集合)(j)的方法?/font>
]]>Hibernate3执行SQL语句 http://www.aygfsteel.com/rain1102/archive/2008/03/28/189371.htmlEric.Zhou Eric.Zhou Fri, 28 Mar 2008 15:13:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/03/28/189371.html http://www.aygfsteel.com/rain1102/comments/189371.html http://www.aygfsteel.com/rain1102/archive/2008/03/28/189371.html#Feedback 1 http://www.aygfsteel.com/rain1102/comments/commentRss/189371.html http://www.aygfsteel.com/rain1102/services/trackbacks/189371.html
public Integer batchSave(final String sql){
Session session = this.getSession();
Transaction tx = session.beginTransaction();
Integer result = -1;
try {
tx.begin();
result = session.createSQLQuery(sql).executeUpdate();
session.flush();
tx.commit();
} catch (DataAccessException e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();
}
} finally {
session.close();
}
return result;
} ]]> Hibernate3 错误Q?could not initialize proxy - no Session http://www.aygfsteel.com/rain1102/archive/2008/02/28/182707.htmlEric.Zhou Eric.Zhou Thu, 28 Feb 2008 08:04:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/02/28/182707.html http://www.aygfsteel.com/rain1102/comments/182707.html http://www.aygfsteel.com/rain1102/archive/2008/02/28/182707.html#Feedback 10 http://www.aygfsteel.com/rain1102/comments/commentRss/182707.html http://www.aygfsteel.com/rain1102/services/trackbacks/182707.html 异常Q?br />
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111 )
原因Q?/font> hibernate3 many-to-one 的默认选项? lazy = "proxy"
解决Ҏ(gu)Q?/strong> ]]> 利用Hibernate Search全文(g)索你的领域模?/title> http://www.aygfsteel.com/rain1102/archive/2008/02/18/180470.htmlEric.Zhou Eric.Zhou Mon, 18 Feb 2008 07:16:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/02/18/180470.html http://www.aygfsteel.com/rain1102/comments/180470.html http://www.aygfsteel.com/rain1102/archive/2008/02/18/180470.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/180470.html http://www.aygfsteel.com/rain1102/services/trackbacks/180470.html Hibernate Search目的BetaW二版刚刚发布。InfoQ为此采访?jin)Hibernate Search目的发起hEmmanuel Bernard以了(jin)解更多细节,Emmanuel同时也是相关目Hibernate Annotations和Hibernate EntityManager的发起h。根据Emmanuel所aQHibernate Search目的是帮助Hibernate的用者或是Java Persistence APIQJPAQ的使用者可以通过全文搜烦(ch)索引来访问Hibernate或JPA理的对象。Hibernate Search目的主要特性包含以下几个方面:(x)
Lucene集成——作为强大高效的(g)索引擎,Lucene的美名早已久l考验?jin)?
数据的自动插入和更新——当一个对象通过Hibernated或更新时Q烦(ch)引也?x)相应进行透明的更斎ͼ
支持众多复杂的搜索方式——可快速的使用通配W进行搜索,以及(qing)多关键词全文(g)索(multi-word text searchesQ和q似或同义词搜烦(ch)Qapproximation/synonym searchesQ,或根据相x(chng)排列搜索结果;
搜烦(ch)集群QSearch ClusteringQ——Hibernate Search提供?jin)内建搜索集解x(chng)案,其中包括一个基于JMS的异步查询和索引pȝQ?
对Lucene API接口的直接调用——如果用h处理某些特别复杂的问题Q可以在查询中直接用Lucene提供的API接口Q?
对Lucene的自动管理——Hibernate Search可以理q优化Lucene的烦(ch)引,q且非常高效C用Lucene的API接口?
目的主要目标包含以下几个方面:(x)
易用性——和Hibernate的ORM映射一PHibernate Search帮助用户实现?jin)业?0%的工作,q且使用户专注于余下更ؓ(f)困难的业务实现部分;
和已有的Hibernate/JPA~程模型保持一致性——更L地集成Hibernate/JPA~程模型?#8220;一开始就致力要实现的目标”?/p>
]]> SetQList和Hibernate里面的PersistentSet http://www.aygfsteel.com/rain1102/archive/2008/01/16/175733.htmlEric.Zhou Eric.Zhou Wed, 16 Jan 2008 09:39:00 GMT http://www.aygfsteel.com/rain1102/archive/2008/01/16/175733.html http://www.aygfsteel.com/rain1102/comments/175733.html http://www.aygfsteel.com/rain1102/archive/2008/01/16/175733.html#Feedback 3 http://www.aygfsteel.com/rain1102/comments/commentRss/175733.html http://www.aygfsteel.com/rain1102/services/trackbacks/175733.html
然后看到Hibernate里面用到一对多Q或者多对多时候会(x)用到SetQ然后我看自qmodelQ里面明明用的是HashSetQؓ(f)什么他可以按照集合里对象的字D|序呢Q问?jin)杨大哥l于知道?jin),原来在返回的时候返回给用户的是Hibernate的自qc:(x)org.hibernate.collection.PersistentSet。Oh my god! ]]> MySQL下用Hibernate的Query中setMaxResultsҎ(gu)出现错误 http://www.aygfsteel.com/rain1102/archive/2007/12/27/170767.htmlEric.Zhou Eric.Zhou Wed, 26 Dec 2007 16:47:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/12/27/170767.html http://www.aygfsteel.com/rain1102/comments/170767.html http://www.aygfsteel.com/rain1102/archive/2007/12/27/170767.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/170767.html http://www.aygfsteel.com/rain1102/services/trackbacks/170767.html
System Runtime Error: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
q是因ؓ(f)MySQL不支持topQ而是使用?jin)limitQ?br />
目前q没扑ֈ解决办法Q不知道Z么Hibernate搞出q玩意,q吗不{换一下,q是bug呢!晕!
l于解决?jin),不是人家的错误,而是我自己弄错了(jin)。方aq错?jin)!p|Q?img src ="http://www.aygfsteel.com/rain1102/aggbug/170767.html" width = "1" height = "1" /> ]]> query.scroll()和query.setMaxResults();query.setFirstResult() http://www.aygfsteel.com/rain1102/archive/2007/12/26/170754.htmlEric.Zhou Eric.Zhou Wed, 26 Dec 2007 15:13:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/12/26/170754.html http://www.aygfsteel.com/rain1102/comments/170754.html http://www.aygfsteel.com/rain1102/archive/2007/12/26/170754.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/170754.html http://www.aygfsteel.com/rain1102/services/trackbacks/170754.html query.scroll()和query.setMaxResults();query.setFirstResult()
q这两种Ҏ(gu)都可以取C定范围内的数据,用来数据分页昄。那么那U方法更好呢Q?/p>
scroll是用JDBC2.0的可滚动l果集实玎ͼquery.setMaxResults();query.setFirstResult()是数据库SQL语句实现?/p>
在数据库q行分页是首选的方式。数据库分页实际上是利用数据库本wSQL扩展的功能进行分,例如MySQL?limit 0,50q样的SQL语句。不但速度快,而且非常节省内存。不q不是每U数据库的都有这U分|持的SQLQ例如SQL Server׃支持?/p>
scroll是利用JDBC2.0的功能做分页的,那么完全取决于特定数据库的JDBC Driver的实C(jin)。事实上大部分JDBC Driver都是把所有的l果集都一ơ取到内存,然后再分늚。如果这个结果集非常大,例如几万条,不但E序执行速度?x)很慢,而且很容易导致out of memory。当然个别JDBC Driver使用?jin)服务器端游标来实现Q那么就不会(x)Dq种问题Q例如jTDS?/p>
]]> Hibernate的复杂用法HibernateCallback http://www.aygfsteel.com/rain1102/archive/2007/12/26/170638.htmlEric.Zhou Eric.Zhou Wed, 26 Dec 2007 09:09:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/12/26/170638.html http://www.aygfsteel.com/rain1102/comments/170638.html http://www.aygfsteel.com/rain1102/archive/2007/12/26/170638.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/170638.html http://www.aygfsteel.com/rain1102/services/trackbacks/170638.html HibernateTemplate的操作方式?/span>HibernateTemplateq Object execute(HibernateCallback action)
q List execute(HibernateCallback action)
的实例, HibernateCallback数据讉K中用。程序开发者通过 HibernateCallback灉|的方式来讉K数据库,解决 Spring后灵zL不的~陷?/span>HibernateCallbackQ该Ҏ(gu)只有一个参?/span>Session的匿名内部类来获?/span>HibernateCallback的方法体是 Spring
return result;
}
});
}
}
doInHibernate Session Session Session Spring Hibernate ]]> HibernateTemplate的常规用?/title> http://www.aygfsteel.com/rain1102/archive/2007/12/26/170633.htmlEric.Zhou Eric.Zhou Wed, 26 Dec 2007 08:46:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/12/26/170633.html http://www.aygfsteel.com/rain1102/comments/170633.html http://www.aygfsteel.com/rain1102/archive/2007/12/26/170633.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/170633.html http://www.aygfsteel.com/rain1102/services/trackbacks/170633.html HibernateTemplate更增加对命名 SQL的常规用法,可完成大多?/span>DAO操作。下面是 HibernateTemplateq void delete(Object entity)q deleteAll(Collection entities)q find(String queryString)查询字符串来q回实例集合
q findByNamedQuery(String queryName)q get(Class entityClass, Serializable id)q save(Object entity)q saveOrUpdate(Object entity)q update(Object entity)是持久状?/span>
q setMaxResults(int maxResults)
]]> MyEclipse 开?SSH 整合?java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit 解决Ҏ(gu) http://www.aygfsteel.com/rain1102/archive/2007/12/23/169853.htmlEric.Zhou Eric.Zhou Sun, 23 Dec 2007 12:47:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/12/23/169853.html http://www.aygfsteel.com/rain1102/comments/169853.html http://www.aygfsteel.com/rain1102/archive/2007/12/23/169853.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/169853.html http://www.aygfsteel.com/rain1102/services/trackbacks/169853.html
Java .lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)
Spring ?/span> Hibernate q的一?/span> jar 文g发生?jin)版本冲H?/span>, 删除 WEB-INF/lib/asm-2.2.3.jar 然后重启 Tomcat.
asm-2.2.3.jar
asm.jar
asm-attrs.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar ]]> Hibernate 参数讄一览表(? http://www.aygfsteel.com/rain1102/archive/2007/07/16/130548.htmlEric.Zhou Eric.Zhou Mon, 16 Jul 2007 05:46:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/07/16/130548.html http://www.aygfsteel.com/rain1102/comments/130548.html http://www.aygfsteel.com/rain1102/archive/2007/07/16/130548.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/130548.html http://www.aygfsteel.com/rain1102/services/trackbacks/130548.html Hibernate 参数讄一览表
属性名
用?
一个Hibernate cd允许Hibernate针对特定的关pL据库生成优化的SQL. 取?/span>
输出所有SQL语句到控制台. 有一个另外的选择是把 q个log category设ؓ(f) ?eg. |
在log和console中打印出更漂亮的SQL?取?/span> |
在生成的SQL? 给定的schema/tablespace附加于非全限定名的表名上. 取?/span>
在生成的SQL? 给定的catalog附加于非全限定名的表名上. 取?/span>
创徏后,自动用这个名字绑定到JNDI? 取?/span>
为单向关?一对一, 多对一)的外q接抓取Qouter join fetchQ树(wi)讄最大深? gؓ(f) 意味着关闭默认的外连接抓? 取?/span> ?tt class=literal>?tt class=literal>之间取?
为Hibernate兌的批量抓取设|默认数? 取?/span> 的取gؓ(f) , , ?tt class=literal>
为由q个 打开的所有Session指定默认的实体表现模? 取?/span> , ,
强制Hibernate按照被更新数据的主键Qؓ(f)SQL更新排序。这么做减在高ƈ发系l中事务的死锁?取?/span> |
如果开? Hibernate收集有助于性能调节的统计数? 取?/span> |
如果开? 在对象被删除时生成的标识属性将被重设ؓ(f)默认? 取?/span> |
如果开? Hibernate在SQL中生成有助于调试的注释信? 默认gؓ(f) . 取?/span> |
Hibernate JDBC和连?connection)属?br>
属性名
用?
非零|指定JDBC抓取数量的大?(调用 ).
非零|允许Hibernate使用JDBC2的批量更? 取?/span> ?tt class=literal>?tt class=literal>之间的?
如果你想让你的JDBC驱动?tt class=literal>q回正确的行计数 , 那么此属性设?tt class=literal>(开启这个选项通常是安全的). 同时QHibernateؓ(f)自动版本化的数据使用扚wDML. 默认gؓ(f) . eg. |
选择一个自定义?tt class=literal>. 多数应用E序不需要这个配|属? eg.
允许Hibernate使用JDBC2的可滚动l果? 只有在用用h供的JDBCq接Ӟq个选项才是必要? 否则Hibernate?x)用连接的元数? 取?/span> |
在JDBCd ?tt class=literal> 的类型时使用?stream)(pȝU属?. 取?/span> |
在数据插入数据库之后Q允怋用JDBC3 来获取数据库生成的key(?。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器旉到问题,请将此D为false. 默认情况下将使用q接的元数据来判定驱动的能力. 取?/span>
自定?tt class=literal>的类? 此类用来向Hibernate提供JDBCq接. 取?/span>
讄JDBC事务隔离U别. 查看Java.sql.Connection 来了(jin)解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离U别. 取?/span>
允许被缓存的JDBCq接开启自动提?autocommit) (不徏?. 取?/span> |
指定Hibernate在何旉放JDBCq接. 默认情况?直到Session被显式关闭或被断开q接?才会(x)释放JDBCq接. 对于应用E序服务器的JTA数据? 你应当?tt class=literal>, q样在每ơJDBC调用后,都会(x)d的释放连? 对于非JTA的连? 使用 在每个事务结束时释放q接是合理的. ؓ(f)JTA和CMT事务{略选择 , 为JDBC事务{略选择 . 取?/span> | | |
<propertyName>
JDBC属?tt class=literal>传递到 中去.
<propertyName>
属?tt class=literal>传递到JNDI 中去.
Hibernate~存属?br>
属性名
用?
自定义的 的类? 取?/span>
以频J的L作ؓ(f)代h(hun), 优化二~存来最化写操? 在Hibernate3中,q个讄对的集群~存非常有用, 寚w缓存的实现而言Q默认是开启的. 取?/span>
允许查询~存, 个别查询仍然需要被讄为可~存? 取?/span>
能用来完全禁止用二U缓? 寚w些在cȝ映射定义中指?tt class=literal>的类Q会(x)默认开启二U缓? 取?/span>
自定义实?tt class=literal>接口的类? 默认为内建的 . 取?/span>
二~存区域名的前缀. 取?/span>
强制Hibernate以更人性化的格式将数据存入二~存. 取?/span>
Hibernate事务属?br>
属性名
用?
一?tt class=literal>的类? 用于Hibernate API (默认?tt class=literal>). 取?/span>
一个JNDI名字Q被 用来从应用服务器获取JTA . 取?/span>
一?tt class=literal>的类?- 当用JVMU缓存,或在JTA环境中用hilo生成器的时候需要该c? 取?/span>
如果开? session在事务完成后被自动清洗(flush)?现在更好的方法是使用自动session上下文管理?span class=strong>取?/span> |
如果开? session在事务完成后被自动关闭?现在更好的方法是使用自动session上下文管理?span class=strong>取?/span> |
其他属?br>
属性名
用?
?当前" 指定一?自定义的){略?span class=strong>eg. | |
选择HQL解析器的实现. 取?/span> or
Hibernate查询中的W号映射到SQL查询中的W号 (W号可能是函数名或常量名?. 取?/span>
?tt class=literal>创徏Ӟ自动(g)查数据库l构Q或者将数据库schema的DDL导出到数据库. 使用 ?在显式关?tt class=literal>Ӟdrop掉数据库schema. 取?/span> | | |
开启CGLIB来替代运行时反射机制(pȝU属?. 反射机制有时在除错时比较有用. 注意即关闭q个优化, Hibernateq是需要CGLIB. 你不能在 中设|此属? 取?/span> |
SQL方言
你应当LZ的数据库?tt class=literal>属性设|成正确? 子类. 如果你指定一U方a, Hibernateؓ(f)上面列出的一些属性用合理的默认? Z省去?jin)手工指定它们的功?
Hibernate SQL方言 ( )
RDBMS
方言
DB2
DB2 AS/400
DB2 OS390
PostgreSQL
MySQL
MySQL with InnoDB
MySQL with MyISAM
Oracle (any version)
Oracle 9i/10g
Sybase
Sybase Anywhere
Microsoft SQL Server
SAP DB
Informix
HypersonicSQL
Ingres
Progress
Mckoi SQL
Interbase
Pointbase
FrontBase
Firebird
Hibernate日志cd
cd
功能
在所有SQL DML语句被执行时为它们记录日?
为所有JDBC参数记录日志
在所有SQL DDL语句执行时ؓ(f)它们记录日志
在session清洗(flush)Ӟ为所有与其关联的实体(最?0?的状态记录日?
为所有二U缓存的zd记录日志
Z务相关的zd记录日志
为所有JDBC资源的获取记录日?
在解析查询的时?记录HQL和SQL的AST分析日志
为JAAS认证h做日?
ZQ何Hibernate相关信息做日?(信息量较? 但对查错非常有帮?
JTA TransactionManagers
Transaction工厂c?
应用E序服务?
JBoss
Weblogic
WebSphere
WebSphere 6
Orion
Resin
JOTM
JOnAS
JRun4
Borland ES
原文地址Q?a >http://www.ideagrace.com/html/doc/2007/01/30/08608.html ]]> Open Session in Test ?qing)自动Rollback http://www.aygfsteel.com/rain1102/archive/2007/05/15/117541.htmlEric.Zhou Eric.Zhou Tue, 15 May 2007 03:09:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/05/15/117541.html http://www.aygfsteel.com/rain1102/comments/117541.html http://www.aygfsteel.com/rain1102/archive/2007/05/15/117541.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/117541.html http://www.aygfsteel.com/rain1102/services/trackbacks/117541.html 如果不能l承于这个基c,可以自己单编写,代码是这L(fng)Q?br> protected PlatformTransactionManager transactionManager; protected TransactionStatus transactionStatus; protected boolean defaultRollback = true; public void setUp() { transactionManager = (PlatformTransactionManager) ctx.getBean("transactionManager"); transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition()); } public void tearDown() { if (defaultRollback) transactionManager.rollback(this.transactionStatus); else transactionManager.commit(this.transactionStatus); } (注,hibernate太奸诈了(jin)Q如果全部默认回滚,只会(x)在session里干z,一点不写数据库Q达不到完全的测试效果? ]]> 关于Spring中的回滚问题AbstractTransactionalDataSourceSpringContextTests http://www.aygfsteel.com/rain1102/archive/2007/05/15/117518.htmlEric.Zhou Eric.Zhou Tue, 15 May 2007 02:06:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/05/15/117518.html http://www.aygfsteel.com/rain1102/comments/117518.html http://www.aygfsteel.com/rain1102/archive/2007/05/15/117518.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/117518.html http://www.aygfsteel.com/rain1102/services/trackbacks/117518.html HibernateTemaplate.executeWithSession(...){ public Object doInHibernate(Session session) { runTest(); session.flush();//synchornize database, errors will be reported. session.clear();}...} 而AbstractTransactionalDataSourceSpringContextTests只要你不调用super.setDefaultRollback(false);q个基类默认׃(x)回滚! 于是由此产生hibernateh,无法发现数据库操?然后我们你在试中显C用session.flush 或者参杂一些查询调?其实也是Z(jin)触发session.flush)?/p>
不过q里面也有些陷阱:如果你的试q是?x)把数据写入了(jin)数据库的?可能是由于你加蝲的spring配置文g里有多个事务理器或session工厂,从而导致AbstractTransactionalDataSourceSpringContextTests没有获得正确的TransactionManager或SessionFactory,所以就没能回滚不过q种错误也不太容易犯,因ؓ(f)AbstractTransactionalDataSourceSpringContextTests默认按类型组?如果她发现有多个TransactionManagercd的bean是要报错?此时你需要调用setAutowireMode(this.AUTOWIRE_BY_NAME);使其按名U组装?br> 另外值得注意的是Q用MYSQL时候表的类型选择。例?/p>
CREATE TABLE `myisam` ( `id` int ( 11 ) NOT NULL auto_increment, `name` varchar ( 100 ) default NULL , `content` text , PRIMARY KEY (`id`) ) ENGINE = MyISAM DEFAULT CHARSET = gbk; q时候应该把cd改ؓ(f)InnoDB?/span>
MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎Q?#183; MyISAM理非事务表。它提供高速存储和(g)索,以及(qing)全文搜烦(ch)能力。MyISAM在所有MySQL配置里被支持Q它是默认的存储引擎Q除非你配置 MySQL默认使用另外一个引擎?·MEMORY存储引擎提供“内存?sh)?#8221;表。MERGE存储引擎允许集合被处理同样的MyISAM表作Z个单独的表。就像MyISAM一P MEMORY和MERGE存储引擎处理非事务表Q这两个引擎也都被默认包含在MySQL中?释:(x)MEMORY存储引擎正式地被定为HEAP引擎?#183; InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系l发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或止M引擎?#183;EXAMPLE存储引擎是一?#8220;存根”引擎Q它不做什么。你可以用这?引擎创徏表,但没有数据被存储于其中或从其中检索?/span>
]]> Hibernate中的多对多映?/title> http://www.aygfsteel.com/rain1102/archive/2007/04/10/109628.htmlEric.Zhou Eric.Zhou Tue, 10 Apr 2007 06:31:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/04/10/109628.html http://www.aygfsteel.com/rain1102/comments/109628.html http://www.aygfsteel.com/rain1102/archive/2007/04/10/109628.html#Feedback 1 http://www.aygfsteel.com/rain1102/comments/commentRss/109628.html http://www.aygfsteel.com/rain1102/services/trackbacks/109628.html private Set<Subscription> subscriptions = new HashSet<Subscription>(0); Subscription.java private Set<Payment> payments = new HashSet<Payment>(0); Payment.hbm.xml<set name="subscriptions" table="subscriptionpayment" inverse="false" cascade="none"> <key> <column name="PaymentID" /> </key> <many-to-many class="com.test.eric.model.Subscription"> <column name="SubscriptionID" /> </many-to-many> </set> Subscription.hbm.xml<set name="payments" table="subscriptionpayment" inverse="false" cascade="none"> <key> <column name="SubscriptionID" /> </key> <many-to-many class="com.test.eric.model.Payment"> <column name="PaymentID" /> </many-to-many> </set> ]]> Hibernate中的主键生成Ҏ(gu)native与assigned http://www.aygfsteel.com/rain1102/archive/2007/04/04/108395.htmlEric.Zhou Eric.Zhou Wed, 04 Apr 2007 03:46:00 GMT http://www.aygfsteel.com/rain1102/archive/2007/04/04/108395.html http://www.aygfsteel.com/rain1102/comments/108395.html http://www.aygfsteel.com/rain1102/archive/2007/04/04/108395.html#Feedback 1 http://www.aygfsteel.com/rain1102/comments/commentRss/108395.html http://www.aygfsteel.com/rain1102/services/trackbacks/108395.html <generator class="native"></generator> 而当是自己添加的时候则需要改为assigned?br><generator class="assigned"></generator> 否则会(x)出现异常Q?img src ="http://www.aygfsteel.com/rain1102/aggbug/108395.html" width = "1" height = "1" /> ]]> WSH(webwork+spring+hibernate)+mysql http://www.aygfsteel.com/rain1102/archive/2006/12/19/88796.htmlEric.Zhou Eric.Zhou Tue, 19 Dec 2006 06:55:00 GMT http://www.aygfsteel.com/rain1102/archive/2006/12/19/88796.html http://www.aygfsteel.com/rain1102/comments/88796.html http://www.aygfsteel.com/rain1102/archive/2006/12/19/88796.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/88796.html http://www.aygfsteel.com/rain1102/services/trackbacks/88796.html
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " <web-app> <display-name>Third Team</display-name>
<!-- <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>com.founder.study.forum.helper.FilterChar</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter>--> <filter> <filter-name>webwork</filter-name> <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class> </filter> <!-- <filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class> </filter>
<filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>--> <filter-mapping> <filter-name>webwork</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- This typically isn't required, as the taglib is included in webwork.jar. If you really need a taglib configuration within web.xml, copy webwork/src/java/META-INF/taglib.tld to the WEB-INF directory as webwork.tld. --> <taglib> <taglib-uri>webwork</taglib-uri> <taglib-location>/WEB-INF/lib/webwork-2.2.4.jar</taglib-location> </taglib> <!-- <taglib> <taglib-uri>sitemesh-decorator</taglib-uri> <taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location> </taglib> <taglib> <taglib-uri>sitemesh-page</taglib-uri> <taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location> </taglib>--> </web-app>xwork.xml<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" " http://www.opensymphony.com/xwork/xwork-1.1.1.dtd ">
<xwork> <include file="webwork-default.xml" /> <package name="default" extends="webwork-default"> <interceptors> <interceptor-stack name="modelParamsStack"> <interceptor-ref name="model-driven" /> <interceptor-ref name="params" /> </interceptor-stack> </interceptors> </package> </xwork>
webwork.properties
webwork.objectFactory = spring webwork.devMode = true webwork.tag.altSyntax=true webwork.locale=zh_CN webwork.i18n.encoding=UTF-8 webwork.custom.i18n.resources=com.founder.study.forum.resource.ApplicationResources
jdbc.properties
# Properties file with JDBC-related settings. # Applied by PropertyPlaceholderConfigurer from "applicationContext-*.xml". # Targeted at system administrators, to avoid touching the context XML files.
jdbc.driverClassName=org.gjt.mm.mysql.Driver jdbc.url=jdbc:mysql://localhost:3306/forum?useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=root
hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true hibernate.hbm2ddl.auto=updateapplicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
<beans default-autowire="byName"> <!-- JDBC Config /author Jerome_mao--> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="/WEB-INF/jdbc.properties" /> </bean> <!-- Config DateSource /author Jerome_mao--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" singleton="true"> <property name="dataSource"> <ref local="dataSource" /> </property> <property name="mappingResources"> <list> <value>com/founder/study/forum/model/Threadgroups.hbm.xml</value> <value>com/founder/study/forum/model/User.hbm.xml</value> <value>com/founder/study/forum/model/Userrole.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <!-- <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>--> </props> </property> </bean> <!-- Hibernate transaction processing /author Jerome_mao--> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean>
<!-- commerce logic service config --> <!-- User Service /author Jerome_mao--> <bean id="userService" class="com.founder.study.forum.service.impl.UserServiceImpl"> <property name="userDAO"> <ref bean="userDAO"/> </property> </bean> <!-- Data persistent layer --> <!-- User login /author Jerome_mao --> <bean id="userDAO" class="com.founder.study.forum.dao.hibernate.UserDAOHibernate"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="forumService" class="com.founder.study.forum.service.impl.ForumServiceImpl"> <property name="forumTypeDAO"> <ref local="forumTypeDAO"/> </property> </bean> <bean id="forumTypeDAO" class="com.founder.study.forum.dao.hibernate.ForumTypeDAOHibernate"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="messageService" class="com.founder.study.forum.service.impl.MessageServiceImpl"> <property name="messageTypeDAO"> <ref local="messageTypeDAO"/> </property> </bean> <bean id="messageTypeDAO" class="com.founder.study.forum.dao.hibernate.MessageTypeDAOHibernate"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="adminService" class="com.founder.study.forum.service.impl.AdminServiceImpl"> <property name="adminDAO"> <ref local="adminDAO"/> </property> </bean> <bean id="adminDAO" class="com.founder.study.forum.dao.hibernate.AdminDAOHibernate"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> </beans>
]]>
webwork+spring+hibernate架构目录l构 http://www.aygfsteel.com/rain1102/archive/2006/12/11/86877.htmlEric.Zhou Eric.Zhou Mon, 11 Dec 2006 05:21:00 GMT http://www.aygfsteel.com/rain1102/archive/2006/12/11/86877.html http://www.aygfsteel.com/rain1102/comments/86877.html http://www.aygfsteel.com/rain1102/archive/2006/12/11/86877.html#Feedback 0 http://www.aygfsteel.com/rain1102/comments/commentRss/86877.html http://www.aygfsteel.com/rain1102/services/trackbacks/86877.html
转自http://www.aygfsteel.com/black_zerg/archive/2005/05/30/5327.html
src
Java
dao
Dao
Impl
hibernate
domain
logic
service
serviceimpl
impl
web
Java
common
filter.
displaytag
displaytag
wrapper.
webwork
action
BaseAction
CrudAction
Crud
CaseDispatcher
Action
session
其他
action
webroot
Spring
applicationContext.xml
applicationContext-db.xml
Webwork
xwork.xml
webwork.properties
i18n
labels.properties
log4j
log4j.properties
displaytag
displaytag.properties
dbConnect
jdbc.properties
1Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
spring
hibernate
spring
hibernate
Spring
webwork
autoware
2Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
displaytag
3Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
displaytag
excel
4Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
webwork
5Q?/span>
jsp
taglib
css
jsp
<% %>
script
。同时我们用两?/span>
include
taglib
js
html
jsp
6Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
我们使用
filter
gbk
Java
unicode
url
7Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
I18n
jsp
labels.properties
jstl
webwork
8Q?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
webwork
validate
xml
action
]]>
վ֩ģ壺
|
ʯ¥ |
봨 |
ˮ |
γ |
|
Ӫ |
|
̨ |
|
|
|
лͨ |
̶ |
˳ |
|
̩ |
|
|
|
Զ |
|
Ѩ |
Դ |
ָ |
|
Դ |
ɽ |
|
|
|
ɽ |
|
̨ɽ |
ߴ |
|
|
|
|
|
|